簡體   English   中英

取消引用'for'循環初始化程序中的指針會產生分段錯誤

[英]Dereferencing a pointer in a 'for' loop initializer creates a segmentation fault

我在for循環中使用指針時遇到問題。 在我的for循環初始化程序中,我取消引用一個int指針並給它一個值'0'。 當我在循環中使用該解除引用的指針時,我得到了一個分段錯誤,我不明白為什么。 我正在使用Code :: Blocks和C GNU GCC編譯器。

  1. 看看監視窗口,我可以看到在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的第一部分中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;
      |          ^

https://coliru.stacked-crooked.com/a/5de37f53cf0b094d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM