我有一个无效功能
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的新手,到目前为止一直很头疼。
答案 0 :(得分:7)
ptr
是一个局部变量,他的生命周期以函数结束,你需要一个指向指针的指针才能改变num
中的main
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;
}
答案 1 :(得分:1)
对于初学者来说,函数foo被声明为
void foo(int *ptr);
^^^^^^^^
该参数的类型为int *
。当你调用像
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
。