1

平台:Linux、OSX
编译器:GCC

我有一个简单的程序,目前让我感到困惑——我知道我正在弄乱几种不同类型的数组/指针来产生这个问题——它是故意的——我试图理解它。

列出的代码将按预期编译和运行,但data4在调用或更改时strsep(&data4, "e");会导致分段错误。我想了解为什么。data1data3

#include <stdio.h>
#include <string.h>

int main(int c, char** v) {
    char* data1 = "hello\0";
    char* data2 = strdup(data1);
    size_t sz = strlen(data1);
    char data3[sz+1];
    char* data4;

    memset(data3, 0, sz+1);
    data4 = strncpy(data3, data1, sz);
    data4[sz] = '\0';

    char* found = strsep(&data4, "e");

    if (found == NULL) {
        printf("nothing found\n");
    } else {
        printf("found e\n");
    }

    return 0;
}
4

1 回答 1

5

在对 strsep(&data4, "e") 的调用中更改 data4;到 data1 或 data3 会导致分段错误。

在这种情况下:

char* found = strsep(&data1, "e");

所指向的字符串data1是文字,因此无法更改。当strsep()尝试将'\0'放入其中时,段错误。

在另一种情况下:

char* found = strsep(&data3, "e");

data3是一个数组,而不是一个指针(即使数组很容易计算为指针,它们实际上并不是指针),因此strsep()无法更新指针的值,这是它一旦找到令牌就会尝试做的事情。我从 gcc 收到以下警告,试图指出这一点:

test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type
于 2010-10-19T20:30:14.100 回答