[英]Dereferencing a pointer in a 'for' loop initializer creates a segmentation fault
我在for
循環中使用指針時遇到問題。 在我的for
循環初始化程序中,我取消引用一個int
指針並給它一個值'0'。 當我在循環中使用該解除引用的指針時,我得到了一個分段錯誤,我不明白為什么。 我正在使用Code :: Blocks和C GNU GCC編譯器。
看看監視窗口,我可以看到在for
循環期間變量有一個隨機數。
似乎解除引用的指針在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
的第一部分中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
的初始化器的一部分發生,因此它不會聲明一個新變量。 但我不建議這樣做,因為它會使您的代碼更難以閱讀和理解。
您正在聲明一個名為p
全新變量:
for (int i=3, (*p)=0 ; i>=0; i--)
這與:
for (int i=3, *p=0 ; i>=0; i--)
所以你要創建一個int i
和一個int *p
,它指向地址0.這與前面定義的p
。 它只是遮住它。 因此,當您取消引用它時,您將獲得段錯誤。
提示:當變量影響另一個變量時,使用-Wshadow
來獲取警告。
[] $ gcc main.c -Wshadow
main.c: In function ‘main’:
main.c:13:21: warning: declaration of ‘p’ shadows a previous local [-Wshadow]
13 | for (int i=3, (*p)=0 ; i>=0; i--) // Here *p is a random number
| ^
main.c:6:10: note: shadowed declaration is here
6 | int *p = NULL;
| ^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.