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循环,如何在循环中删除这个分段错误....实际上我正在学习这个双指针的东西,所以我可能是一个在提出几个问题时有点愚蠢......提前谢谢
答案 0 :(得分:3)
for循环中的*p
取消引用第一个指针。
但是,当您使用NULL
调用函数时,该指针为myfunc(NULL);
。
答案 1 :(得分:2)
每当取消引用nullpointer时,都会调用未定义的行为(例如,分段错误)。
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;
}
答案 2 :(得分:0)
感谢您的所有答案,正好在访问for循环的条件部分中的NULL值时导致分段错误。