我正在尝试使用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的行上,它说:隐式声明类型为'void *(unsigned long)'的库函数'malloc'
这是否以不正确的方式格式化该行代码?该程序仍在编译,但在测试时会得到一些意想不到的结果。
答案 0 :(得分:6)
确保包含<stdlib.h>
。
答案 1 :(得分:3)
按照Scott的建议使用<stdlib.h>
或<cstdlib>
,同时,始终确保malloc通过NULL检查返回有效指针。
//malloc unable to allocate memory
if(sequence == NULL)
{
//return;
}
最后,使用free释放内存并避免内存泄漏。
free(sequence);
答案 2 :(得分:3)
如何在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();
}
答案 3 :(得分:2)
使用malloc时的重点:
Malloc函数调用返回指向内存位置的void指针,因此您应该明确地将其转换为所需的数据类型指针。
您应该始终记得释放使用malloc动态分配的内存。 (非常感谢)
您应该始终检查malloc函数调用是否成功。
仅供参考,请查看此链接:http://www.cplusplus.com/reference/cstdlib/malloc/
希望这有帮助。