C. 函数中的 malloc() 和 free() 不起作用 [重复]

Posted

技术标签:

【中文标题】C. 函数中的 malloc() 和 free() 不起作用 [重复]【英文标题】:C. malloc() and free() in function doesn't work [duplicate] 【发布时间】:2021-03-28 09:39:32 【问题描述】:

谁能告诉我,为什么我不能通过 init() 函数为结构数组分配内存?在 main 中手动完成时,一切都很好。当通过 init() 尝试时,没有任何反应(也没有错误消息)。地址总是0x0,我猜是空指针。

#define GAMES 100

typedef struct
  double *scores;
SCORES;

void init(SCORES *arr);

int main()
  SCORES *numbers = NULL;
  init(numbers);

  printf("Adress is: %p\n", numbers);      //Still 0x0
  return 0;




void init(SCORES *arr)
  arr = (SCORES*) malloc(GAMES * sizeof(SCORES));

使用下面的代码尝试它适用于 malloc。我得到了一个地址,但如果我使用 free(),内存仍然被分配。


void init(SCORES **arr)
  *arr = (SCORES*) malloc(GAMES * sizeof(SCORES));


...

init(&numbers);

...

free(numbers);

【问题讨论】:

“内存仍在分配”是什么意思?你如何验证这一点? C(对于此代码也是 C++)使用按值传递。所以init(numbers); 在您的情况下与init(NULL); 相同。换句话说-该函数对numbers一无所知 另外,强制注释使用 malloc() 而不放置 new 是 C++ 中的未定义行为。 @Yksisarvinen 当我使用“ printf("Size: sizeof(number[0])); " 它仍然说为该地址分配了 16 个字节。 【参考方案1】:

在第一个代码 sn-p 中,您传递了numbers 变量的。在函数中你改变了一个局部变量,这样做对变量没有影响的是调用函数。

在第二个sn-p中你正确地传递了numbers的地址,所以它可以在函数中设置,并且对free的调用也是正确的。只是不要在释放后尝试使用numbers 的值,否则为undefined behavior。

【讨论】:

感谢您的回答。问题是,当我使用“ printf("Size: %ld", sizeof(*numbers[0])); ”时,我得到 16 个字节。所以 free() 不会释放任何东西。 @jupiter 这并不是说分配了字节。 sizeof 运算符为您提供操作数类型的大小(以字节为单位),并在编译时进行评估。如果不使用 valgrind 之类的内存调试工具,就无法验证 free 是否工作。 这意味着,理论上,当“sizeof”给出 16 个字节时我不需要担心。谢谢。

以上是关于C. 函数中的 malloc() 和 free() 不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++—new/delete/malloc/free详解

求教关于被调函数中的malloc与free

C语言中已经有了malloc和free,为啥还需要new和delete?

c的free和c++的delete的区别

free函数和malloc函数

堆的分配和释放(malloc,free,calloc,realloc)