gpt4 book ai didi

c - 在 'for' 循环初始值设定项中取消引用指针会产生段错误

转载 作者:太空狗 更新时间:2023-10-29 16:19:24 24 4
gpt4 key购买 nike

我在 for 循环中使用指针时遇到问题。在我的 for 循环初始值设定项中,我取消引用一个 int 指针并将其赋值“0”。当我在循环中使用那个取消引用的指针时,出现段错误,我不明白为什么。我正在使用 Code::Blocks和 C GNU GCC 编译器。

  1. 查看监 window 口,我可以看到在 for 循环期间,变量有一个随机数。

  2. 似乎在 for 循环期间,解除引用的指针失去了作用域。

代码:

#include <stdio.h>

int main(void)
{
int val = 0;
int *p = NULL;
int answer = 0;

p = &val;

*p = 1; // This dereferences and sets to one successfully

for (int i=3, (*p)=0 ; i>=0; i--) // Here *p is a random number
{
printf("do stuff");
(*p) += 1; // Here it causes a segmentation fault
}
answer = *p;
}

我认为像我这样使用指针不会有问题。

最佳答案

仔细看这里:

for (int i=3, (*p)=0 ; i>=0; i--)

for 的第一部分中,您定义了一个名为 p 指针变量,它隐藏了 p 之前定义并将其初始化为 NULL。然后,您在导致段错误的循环中取消引用 NULL 指针。

你不能像那样同时拥有变量定义和对现有变量的赋值,因此将 *p 的赋值移动到循环之前:

*p = 0;
for (int i=3; i>=0; i--)

或者你可以在循环外定义i:

int i;
for (i=3, (*p)=0 ; i>=0; i--)

可以通过滥用逗号运算符将它们压缩在一起:

for (int i=(*p=0,3) ; i>=0; i--)

此处对 p 的赋值作为 i 的初始化程序的一部分发生,因此它不会声明新变量。但我不推荐这样做,因为它会使您的代码更难阅读和理解。

关于c - 在 'for' 循环初始值设定项中取消引用指针会产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57431196/

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