c - free() 即使在我使用 malloc() 分配内存后也无法正常工作


free()

编译时似乎没有取消分配内存。我之前使用 malloc() 进行分配,并对其进行了测试以确保指针不为空。

这些是我在编译代码时遇到的错误

malloc: * 对象 0x7ffee53e1aa4 的错误:指针被释放为 未分配 malloc: * 在 malloc_error_break 中设置断点 调试

void math(int array[], int length, int* sum, int* mult);
int main(void)
{
    int sum = 0;
    int mult = 1 ;
    int a[] = {1, 33, 12, 2, 9, 2};
    int* sump = (int*) malloc(1*sizeof(int));
    if(sump == NULL){
        printf("sump is null");
    }
    int* multp = (int*) malloc(1*sizeof(int));
    if(multp == NULL){
        printf("multp is null");
    }
    sump = ∑
    multp = &mult;
    math(a, 6, sump, multp);
   if(sump != NULL){
       free(sump);
   }
if(multp != NULL){
       free(multp);
   }
    printf("sum: %d mult: %dn", sum, mult);

    return 0;
}
void math(int array[], int length, int* sump, int* multp)
{
    int i;
    int sum = 1; 
    int mult = 1;
    for(i=0; i<length;++i){
        sum += array[i];
        mult *= array[i];
    }
    printf("%d %dn", sum, mult);
    *multp = mult;
    *sump = sum;   
}
int* sump = (int*) malloc(1*sizeof(int));

sump现在指向由 malloc 创建的匿名对象。

sump = &sum;

现在,sump指向您之前定义的对象sum。分配的对象丢失。

if(sump != NULL){
    free(sump);
}

NULL检查是不必要的,因为free(NULL)是合法的,什么都不做。但由于sump不再指向已分配的对象,因此free(sump)具有未定义的行为。(您很幸运,您的运行时系统能够为您诊断它。

错误消息是在运行时生成的,而不是在编译时生成的。

而且您缺少代码顶部所需的 #include 指令:

#include <stdio.h>
#include <stdlib.h>

相关内容

  • 没有找到相关文章

最新更新