如何在C中正确使用malloc?

时间:2014-01-16 03:04:16

标签: c arrays memory malloc

我正在尝试使用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'

这是否以不正确的方式格式化该行代码?该程序仍在编译,但在测试时会得到一些意想不到的结果。

4 个答案:

答案 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?

  1. 请务必包含正确的头文件。这修复了OP的编译器警告。

    #include <stdlib.h>
    
  2. 允许转换返回但在C中不赞成是不必要的。其他人可能不同意,所以最好遵循你小组的编码标准。

    double* sequence = /* cast not required */ malloc(...);
    
  3. 考虑以下风格,因为它更容易编码,审核,维护和IMO,更不容易出错。

    // object_pointer = malloc(sizeof *object_pointer * num_elements);
    // Example
    double* sequence = malloc(sizeof *sequence * numInSeq);
    
  4. 请记住参数类型为size_t,其大小可能与int不同。 size_tsizeof运算符结果的无符号整数类型。

    void *malloc(size_t size);
    
  5. 将否定int传递给malloc()的行为如下:

    malloc((size_t) some_negative_int) -->
    malloc(some_large_size_t)
    
  6. 检查结果。

    if (sequence == NULL) Handle_OutOfMemory();
    
  7. 最后,释放指针。即使指针具有NULL值,也可以释放指针。

    free(sequence);
    
  8. 如果有机会sequence在免费后再次使用,最好立即将其值设置为NULL

    free(sequence);
    sequence = NULL;
    
  9. 分配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时的重点:

  1. Malloc函数调用返回指向内存位置的void指针,因此您应该明确地将其转换为所需的数据类型指针。

  2. 您应该始终记得释放使用malloc动态分配的内存。 (非常感谢)

  3. 您应该始终检查malloc函数调用是否成功。

  4. 仅供参考,请查看此链接:http://www.cplusplus.com/reference/cstdlib/malloc/

    希望这有帮助。