我正在尝试使用malloc()
分配一些内存(我对malloc没有太多经验,因为我刚刚开始学习如何使用它),在使用IDE编译之前收到了警告。
int numInSeq = 0;
int i;
printf("How many numbers do you have in your sequence: ");
scanf("%d", &numInSeq);
double* sequence = (double*) malloc(numInSeq * sizeof(double));
printf("Enter the sequence of the numbers you have (seperated by spaces): ");
for (i = 0; i < numInSeq; i++) {
scanf("%lf", &sequence[i]);
}
警告就在我呼叫malloc的线路上,上面写着:
Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'
这是不是以不正确的方式格式化了那行代码?该程序仍然可以编译,但在测试时出现了一些意想不到的结果。
确保包含<stdlib.h>
。
使用malloc:时的要点
-
Malloc函数调用返回指向内存位置的void指针,因此应该显式将其转换为所需的数据类型指针。
-
您应该始终记住释放使用malloc动态分配的内存。(非常重要)
-
您应该始终检查malloc函数调用是否成功。
仅供检查此链接:http://www.cplusplus.com/reference/cstdlib/malloc/
希望这能有所帮助。
如何在C中正确使用malloc?
-
请确保包含正确的头文件。这修复了OP的编译器警告。
#include <stdlib.h>
-
铸造返回是允许的,但在C中不认为是不必要的。其他人可能不同意,所以最好遵循团队的编码标准。
double* sequence = /* cast not required */ malloc(...);
-
考虑以下风格,因为它更容易编码、审查、维护和IMO,不太容易出错。
// object_pointer = malloc(sizeof *object_pointer * num_elements); // Example double* sequence = malloc(sizeof *sequence * numInSeq);
-
请记住,参数类型为
size_t
,大小可能与int
不同。size_t
是sizeof
运算符结果的无符号整数类型。void *malloc(size_t size);
-
将负
int
传递给malloc()
的行为类似于:malloc((size_t) some_negative_int) --> malloc(some_large_size_t)
-
检查结果。
if (sequence == NULL) Handle_OutOfMemory();
-
最终,释放指针。即使指针具有
NULL
值,也可以释放指针。free(sequence);
-
如果释放后有机会再次使用
sequence
,最好立即将其值设置为NULL
。free(sequence); sequence = NULL;
-
0的分配可以返回也可以不返回
NULL
,并且不是内存不足的情况。double* sequence = malloc(sizeof *sequence * numInSeq); // If `numInSeq` could have a zero value, add test if (sequence == NULL && numInSeq != 0) { Handle_OutOfMemory(); }
按照Scott的建议使用<stdlib.h>
或<cstdlib>
,同时始终确保malloc通过NULL检查返回有效指针。
//malloc unable to allocate memory
if(sequence == NULL)
{
//return;
}
最后,使用free来释放内存并避免内存泄漏。
free(sequence);