从函数访问全局指针时出现seg错误错误

时间:2017-07-09 15:23:25

标签: c pointers global

当我为函数中的指针赋值时,为什么会出现分段错误。

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

指针定义和传递地址有什么不对?

1 个答案:

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

cast the result of malloc?