[英]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.