C

时间:2016-02-16 08:20:38

标签: c pointers

作为训练的一部分,我正在学习指向指针概念的指针。 但是在运行时我遇到了分段错误。

有人可以帮我解决这个问题吗?

以下是代码段:

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;
}

4 个答案:

答案 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;

假设你以相同的方式调用它,第二个例子更加错误。您通过未定义的指针进行分配。行为未定义。