如何在C中正确使用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的线路上,上面写着:

Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'

这是不是以不正确的方式格式化了那行代码?该程序仍然可以编译,但在测试时出现了一些意想不到的结果。

确保包含<stdlib.h>

使用malloc:时的要点

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

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

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

仅供检查此链接:http://www.cplusplus.com/reference/cstdlib/malloc/

希望这能有所帮助。

如何在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();
    }
    

按照Scott的建议使用<stdlib.h><cstdlib>,同时始终确保malloc通过NULL检查返回有效指针。

//malloc unable to allocate memory
if(sequence == NULL)
{
//return;
}

最后,使用free来释放内存并避免内存泄漏。

free(sequence);

相关内容

  • 没有找到相关文章

最新更新