Leetcode——菜鸟笔记1
文章目录
- 题目
- 解题
- 笔记
题目
解题
/*** Note: The returned array must be malloced, assume caller calls free().nums=[2,7,11,15] numsSize=4 target =9 returnSize=2*/int* twoSum(int* nums, int numsSize, int target, int* returnSize) {int flag=0;*returnSize=2;int *returnSum=(int*)malloc((sizeof(int))*2);for(int j=0;j<numsSize;j++){for(int k=j+1;k<numsSize;k++){if(nums[j]+nums[k]==target){returnSum[0]=j;returnSum[1]=k;flag=1;return returnSum;}}if(flag){break;}}*returnSize=0;free(returnSum);return NULL;
}
笔记
- *returnSize=2;设置返回数组长度为2,最后使用完动态空间,该数组长度为0;
- int result = (int)malloc(sizeof(int) * 2); // 分配结果数组
动态分配一个能存储 2 个整数的内存空间,并让指针 result 指向这块内存;
①malloc函数
#include <stdlib.h> // 必须包含此头文件
void* malloc(size_t size);
参数:size 是要分配的字节数(size_t 是无符号整型)。
返回值:成功时返回 void*(通用指针),失败时返回 NULL。
使用方法
int *ptr = (int*)malloc(sizeof(int)); // 分配 1 个 int 的空间(通常 4 字节)
int *arr = (int*)malloc(5 * sizeof(int)); // 分配 5 个 int 的空间(20 字节)
检查是否分配成功,看指针是不是为NULL
if (ptr == NULL) {printf("内存分配失败!\n");exit(1); // 退出程序
}
PS:malloc不会初始化内存,只是申请一块空间,所以里面的内容没有定义,是随机值。
可以使用手动初始化或者calloc
memset(arr, 0, 5 * sizeof(int)); // 全部设为 0
int *arr = (int*)calloc(5, sizeof(int)); // 分配并初始化为 0
②:与malloc匹配的是free,动态申请内存使用完后必须释放内存,不然会导致内存泄漏。
free规则:
只能 free 由 malloc/calloc/realloc 分配的内存。
不能 free 两次(会导致程序崩溃)。
释放后指针应设为 NULL,防止误用。
③:malloc使用场景
题目中的申请动态数组空间
int *arr = (int*)malloc(n * sizeof(int));//n为数组大小
数据结构中的链表、树
struct Node {int data;struct Node* next;
};//结点结构体 包含数据和指针(指向下一个结点的)struct Node* newNode(int data) {struct Node* node = (struct Node*)malloc(sizeof(struct Node));//定义一个结构体指针,指向新申请的空间,node 是一个指向 struct Node 的指针node->data = data;node->next = NULL;return node;
}//创建新节点的函数,malloc申请一个结构体指针,数据赋值给下一个节点的数据部分,新节点的指针先指向NULL
这里的malloc申请的一块大小是和节点大小一样,把malloc返回的void转换橙struct Node
返回堆内存中的数组
动态创建一个大小为 size 的整型数组,并返回该数组的指针。(是我查到的关于malloc使用的场景之一,没有具体用过,但仔细看和1是一样的,只是1给了具体内存的大小,这个用size代替了)
int* createArray(int size) {int *arr = (int*)malloc(size * sizeof(int)); // 动态分配内存return arr; // 返回数组的首地址
}