gpt4 book ai didi

c - 从函数访问全局指针时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:46 25 4
gpt4 key购买 nike

为什么在函数中给指针赋值时会出现段错误。

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

指针定义和传递地址有什么问题?

最佳答案

只需使用编译器警告标志,您就可以找出指针操作中的错误。

在 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?

关于c - 从函数访问全局指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44997987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com