我有一个空函数
void foo(int *ptr) {
//trying to allocate memory to hold 5 ints
ptr = malloc(sizeof(int)*5):
//I loop ptr and assign each with a value i =0 to 4;
}
在主要功能我有这行
int main() {
int *num;
//I called the function
foo(&(num));
free(num);
return 1;
}
我得到munmap_chunk()无效指针错误。我确实试着挖掘更多的信息,但我想不通。我知道这对那些在c工作的人来说是基本的。我想我是通过参考,它应该有效,但事实并非如此。我是C的新手,到目前为止一直很头疼。
ptr
是一个局部变量,他的生命周期以函数结束,您需要一个指向指针的指针来更改main
中的num
void foo(int **ptr) {
//trying to allocate memory to hold 5 ints
*ptr = malloc(sizeof(int)*5);
//I look ptr and assign each with a value i =0 to 5;
}
对于初学者来说,函数foo的声明类似
void foo(int *ptr);
^^^^^^^^
即其参数具有类型CCD_ 4。当你调用类似的函数时
foo(&(num));
^^^^^^
其中其自变量的类型为int **
,因为变量num的声明类似
int *num;
编译器至少应该发出类型不兼容的消息。
您需要以以下方式定义的功能
void foo(int **ptr) {
^^^^^^^^^
//trying to allocate memory to hold 5 ints
*ptr = malloc(sizeof(int)*5):
^^^^
//I loop ptr and assign each with a value i =0 to 4;
}
在这种情况下,函数调用将是正确的,并且由于原始指针是通过引用传递的,因此它将在调用函数后更改。
至于最初的功能定义
void foo(int *ptr) {
//trying to allocate memory to hold 5 ints
ptr = malloc(sizeof(int)*5):
//I loop ptr and assign each with a value i =0 to 4;
}
则它的参数是函数的局部变量,该函数保存参数的副本。作为原始参数副本的局部变量的任何更改都不会影响原始指针本身。退出函数后,局部变量(参数)ptr
将被销毁。