我知道这是一个常见问题,但是就我而言,答案并不那么简单(或者至少我认为是这样)。
我想要的是为 10 个整数分配内存(如下面的方案所示)。
方案:
_____HEAP_____
| |
**numbers -----> *number ---|--> int |
*number ---|--> int |
*number ---|--> int |
.. | |
*number ---|--> int |
|______________|
法典:
int** numbers;
void malloc_number(int* number){
number = malloc(sizeof(int));
}
int main(){
numbers = malloc(10*sizeof(int*));
int n;
for (n=0; n < 10; n++){
//numbers[n] = malloc(sizeof(int)); // THIS WORKS
malloc_number(numbers[n]); // THIS DOESN'T
free(numbers[n]);
}
free(numbers);
}
我似乎不明白为什么这不起作用。在我的脑海中numbers[n]
我传递给malloc_number
是一个指向某个未分配数字的指针。然后我使用 number = malloc(sizeof(int));
(数字 = 数字 [n]) 为该指针分配内存。
我做错了什么?
void malloc_number(int* number){
number = malloc(sizeof(int));
}
此函数泄漏内存。请记住,C 是按值传递的,number
参数是一个具有自动存储持续时间的对象,当malloc_number
返回时被销毁。如果要通过函数修改指针,则必须将指针传递给指针。
void malloc_number(int* number){
number = malloc(sizeof(int));
}
此代码是错误的。您正在设置 var "number" 的值,该值是一个参数,在函数调用后会丢失。正确的代码是:
void malloc_number(int** number){
*number = malloc(sizeof(int));
}
...
malloc_number(&numbers[n]);
另请注意,循环增量的约定是"i"或"j",n 是为最大值或限制保留的。