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() 不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章