当我为函数中的指针赋值时,为什么会出现分段错误。
int *p = NULL;
func(int **y)
{
*y = (int *) malloc(sizeof(int));
*y = 1;
}
int main()
{
func(&p);
printf("%d\n",*p);
}
int *p = NULL;
func(int **y)
{
*y = (int *) malloc(sizeof(int));
*y = 1;
}
int main()
{
int *t = p;
func(&t);
printf("%d\n",*t);
}
指针定义和传递地址有什么不对?
答案 0 :(得分:2)
通过使用编译器警告标志,您可以在指针操作中找出错误。
在Windows和Visual Studio IDE中使用内置调试器来查看编码错误。
在GCC编译器的linux环境中尝试使用此命令编译源代码(在我的情况下为t.c
)
gcc -Wall t.c -o t
gcc产生这些警告
t.c:8:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
func(int **y)
^
t.c: In function ‘func’:
t.c:11:8: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
*y = 1;
^
t.c:12:1: warning: control reaches end of non-void function [-Wreturn-type]
}
很明显,分配*y = 1;
是错误的。
感谢Mark Benningfield在using pointer to pointer
上介绍了有用的链接将您的代码更改为这样可以解决您的问题
#include <stdio.h>
int *p = NULL;
void func(int **y)
{
*y = malloc(sizeof(int));
**y = 1;
}
int main()
{
func(&p);
printf("%d\n",*p);
}
首先,对于不返回任何值的函数,请使用void作为返回类型。
第二,如果我们尝试将指针指向函数的指针作为参数
例如func(int **y)
,因为y可以保存指针的地址
我们必须使用func (&p)
来调用它。 p
是一个整数指针。
最后建议不要将malloc()
的结果与
(int *)malloc(sizeof(int))