不同字符串指针/数组类型的strsep分段错误

时间:2010-10-19 20:13:14

标签: c string memory-management libc

平台:Linux,OSX
编译:GCC

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

列出的代码将按预期编译并运行,但在调用data4strsep(&data4, "e");data1时更改data3会导致分段错误。我想了解原因。

#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;
}

1 个答案:

答案 0 :(得分:5)

  

更改strsep(&amp; 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