【发布时间】:2017-12-13 08:35:42
【问题描述】:
为什么当我在函数中为指针赋值时会出现分段错误。
source_1.c
int *p = NULL;
func(int **y)
{
*y = (int *) malloc(sizeof(int));
*y = 1;
}
int main()
{
func(&p);
printf("%d\n",*p);
}
source_2.c
int *p = NULL;
func(int **y)
{
*y = (int *) malloc(sizeof(int));
*y = 1;
}
int main()
{
int *t = p;
func(&t);
printf("%d\n",*t);
}
指针定义和传递地址有什么问题?
【问题讨论】:
-
*y = 1;将 1 分配给指针。当然是UB。你想要**y = 1吗? -
发布的代码存在一些问题。从他们开始,他们缺少
stdio.h和stdlib.h的必要#include语句 -
om C. 在调用任何堆分配函数(malloc、calloc、realloc)时 1) 始终检查 (!=NULL) 返回值以确保操作成功。 2) 返回类型为
void*,因此可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 -
这一行:
*y = 1;覆盖了刚刚通过调用malloc()设置的指针,值为 1。代码现在有内存泄漏和 DE 引用该指针将尝试从地址 1 读取(这不是程序拥有的地址并且未正确对齐int值,也许您的意思是:*(*y) = 1;