【问题标题】:C. malloc() and free() in function doesn't work [duplicate]C. 函数中的 malloc() 和 free() 不起作用 [重复]
【发布时间】: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 个字节。

标签: arrays c malloc free


【解决方案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 个字节时我不需要担心。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2013-06-16
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多