访问双结构指针,发生分段错误

时间:2016-05-02 10:09:47

标签: c

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循环,如何在循环中删除这个分段错误....实际上我正在学习这个双指针的东西,所以我可能是一个在提出几个问题时有点愚蠢......提前谢谢

3 个答案:

答案 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值时导致分段错误。