簡體   English   中英

訪問雙結構指針,發生分段錯誤

[英]accessing a double structure pointer, segmentation fault occured

typedef struct
{
        int member;
} mystruct;

void myfunc(mystruct **data)
{
        mystruct *const *p;
        for(p = data; *p !=NULL; p++)
        {
                printf("hello\n");
        }
}

void main(int argc, char *argv[])
{
        myfunc(NULL);
}

嘗試用上面的代碼獲取分段錯誤,它主要是在for循環中出錯,如何在該for循環中刪除該分段錯誤....實際上是在學習這種雙指針的東西,所以我可能有點愚蠢問幾個問題。...在此先感謝

for循環中的*p取消引用第一個指針。 但是該指針為NULL ,因為您使用myfunc(NULL);調用了函數myfunc(NULL);

每當取消引用空指針時,就會調用未定義的行為(例如,分段錯誤)。

typedef struct
{
    int member;
} mystruct;

void myfunc(mystruct **data)
{
    mystruct *const *p;
    // this loop assumes data to be a valid pointer
    // to a NULL-terminated array!
    for(p = data; *p != NULL; p++)
    {
        printf("hello\n");
    }
}

int main()
{
    mystruct s;
    mystruct *arr[2];
    arr[0] = &s; // arr[0] points to s
    arr[1] = NULL; // null-terminator
    s.member = 13;
    myfunc(arr);
    // myfunc(NULL); // undefined behaviour

    return 0;
}

您可以通過檢查myfunc中的data來解決此問題:

void myfunc(mystruct **data)
{
    mystruct *const *p;
    // first check data
    if(data != NULL)
    {
        // loop still assumes data to be a NULL-terminated array!
        for(p = data; *p != NULL; ++p)
        {
            printf("hello\n");
        }
    }
}
...
myfunc(NULL); // well defined as the pointer will be checked

如果只想遍歷一個范圍,請考慮標准方法:

void myfunc_range(mystruct *begin, mystruct *end)
{
    mystruct const *it;
    for(it = begin; it != end; ++it)
    {
        printf("hello %d\n", it->member);
    }
}

int main()
{
    mystruct s;
    mystruct arr[2];
    s.member = 42;
    myfunc_range(&s, &s + 1); // iterate over a single element
    arr[0].member = 13;
    arr[1].member = 37;
    myfunc_range(arr, arr + sizeof(arr) / sizeof(*arr)); // iterate over the whole array
    myfunc_range(arr + i, arr + i + k); // iterate over elements arr[i..i+k-1]
    myfunc_range(NULL, NULL); // well defined as NULL == NULL (an empty range)
    // myfunc(arr, &s); // undefined behaviour as s is not part of the array arr

    return 0;
}

感謝您的所有答復,恰好現在在for循環的條件部分中訪問NULL值時會導致分段錯誤。

暫無
暫無

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

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