为什么当双指针作为单个指针发送到函数并且在尝试分配内存时访问时没有出现错误,即使在堆上分配内存,也会导致分段错误。
将双指针作为双指针参数传递给函数 - 效果很好
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void to_fun(char **dbl_ptr)
{
*dbl_ptr = malloc(20);
strcpy(*dbl_ptr,"cool");
}
void main( )
{
char **dbl_ptr = calloc ( 2 , sizeof(char *) );
to_fun ( (dbl_ptr + 1) );
printf("%s\n",*(dbl_ptr + 1) );
}
将双指针作为单指针参数传递给函数 - seg fault
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void to_fun(char *dbl_ptr)
{
dbl_ptr = malloc(20);
strcpy(dbl_ptr,"defnitely not cool");
}
void main( )
{
char **dbl_ptr = calloc ( 2 , sizeof(char *) );
to_fun ( *(dbl_ptr + 1) );
printf("%s\n",*(dbl_ptr + 1) );
}
将双指针作为单指针参数传递给函数 - 运行良好
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void to_fun(char *dbl_ptr)
{
printf("%s\n",dbl_ptr );
}
void main( )
{
char **dbl_ptr = calloc ( 2 , sizeof(char *) );
*(dbl_ptr + 1) = "cool";
to_fun ( *(dbl_ptr + 1) );
}
这只是一个示例代码,可以让你得到问题..这并不意味着像一个即兴的一个等等等等......
我知道指针和解引用是如何工作的,但是上面的东西仍然很烦人。任何人解释原因。
答案 0 :(得分:3)
第一个代码块可以工作,因为你传递一个指针,然后取消引用该指针来修改指针指向的内容(即main
中分配的内存块)。
对于第二个代码块,您需要修改函数参数dbl_ptr
。函数参数的更改不会反映在调用函数中,因为所有参数都是按值传递的。
第三段代码有效,因为您正在读取一个函数参数并取消引用指向有效内存的指针值。
另外,您没有将char **
传递给第二和第三个功能,只传递char *
。
您还没有在main
中分配足够的内存。你分配了2个字节,但你想要的是2 char *
的空间:
char **dbl_ptr = calloc ( 2 , sizeof(char *) );
答案 1 :(得分:2)
如果要从函数内部修改变量,并且变量超出函数范围,则传递指向变量的指针:
void f(double *x) {
*x = 12;
}
void main() {
double z;
f(&z);
printf("%f", z);
}
当你的变量是一个指针时,你需要一个指向指针的指针:
void f(double **x) {
*x = malloc(...);
}
void main() {
double *z;
f(&z);
printf("%f", z[1]);
}