作为训练的一部分,我正在学习指向指针概念的指针。 但是在运行时我遇到了分段错误。
有人可以帮我解决这个问题吗?
以下是代码段:
main()
{
int *ptr;
init(&ptr);
printf(" %d \n",*ptr);
}
init( int **p_ptr)
{
**p_ptr=56;
}
但是以下init()函数运行良好。
init( int **p_ptr)
{
int i=56
**p_ptr=&i;
}
答案 0 :(得分:1)
首先,请编辑您的消息,以便能够很好地显示代码(阅读帮助文档以了解如何执行此操作)。
在C中,指针被分配了一个地址,当你在第二个函数中分配指针&i
时,你指定了i
的地址(但它不应该因为i
在函数末尾被销毁,因为它是一个局部变量,因此工作。当你执行**p_ptr=56;
时,你试图为指针分配你可能无法访问的地址56,这就是你得到分段错误的原因。
希望这有帮助!
答案 1 :(得分:1)
在第一个示例中,指针指向无处,您必须指定要指向的内存。
int myInt;
int *myPtr = &MyInt
或者:
int *myPtr= (int *) malloc (sizeof(int));
编辑:我一直在观看第二种选择,因为var i在函数外部不存在,所以它更加未定义,所以持有i的内存不再为你保留。
答案 2 :(得分:0)
int *ptr;
是指向整数的指针,但您从未初始化它。未定义ptr
的值,因此这是未定义的行为。要使代码正常工作,ptr
的值必须是类型为int
的变量的地址。 *ptr
和**p_ptr
尝试读取ptr
引用的值,这会导致细分错误。像这样调整你的代码:
main()
{
int myInt; // local varibale myInt
int *ptr = &myInt; // pointer ptr refers to local varibale myInt
init(&ptr); // pass pointer to ptr to function init
printf(" %d \n",*ptr);
}
注意在函数init
中,p_ptr
现在是指向ptr
的指针,因此是指向myInt
指针的指针。
当然你也可以分配动态内存:
#include <malloc.h>
main()
{
int *ptr = &myInt = malloc( sizeof( int ) ); // ptr refers to dynamicly allocated memory
init(&ptr);
printf(" %d \n",*ptr);
free( ptr ); // free the dynamic memory
}
答案 3 :(得分:0)
你的两个例子都错了。第一个失败是因为您尚未初始化ptr
以指向已分配的存储空间。您可以使用以下方法修复它:
int i;
int *ptr = &i;
假设你以相同的方式调用它,第二个例子更加错误。您通过未定义的指针进行分配。行为未定义。