Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不同字符串指针/数组类型上的strep分段错误_C_String_Memory Management_Libc - Fatal编程技术网

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

C 不同字符串指针/数组类型上的strep分段错误,c,string,memory-management,libc,C,String,Memory Management,Libc,平台:Linux、OSX 编译器:GCC 我有一个简单的程序,它现在让我很困惑-我知道我正在处理一些不同类型的数组/指针来产生这个问题-这是故意的-我正在努力理解它 所列代码将按预期编译和运行,但在调用strep&data4,e中更改data4;到data1或data3会导致分段错误。我想知道为什么 #include <stdio.h> #include <string.h> int main(int c, char** v) { char* data1 = "

平台:Linux、OSX 编译器:GCC

我有一个简单的程序,它现在让我很困惑-我知道我正在处理一些不同类型的数组/指针来产生这个问题-这是故意的-我正在努力理解它

所列代码将按预期编译和运行,但在调用strep&data4,e中更改data4;到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;
}
将调用中的数据4更改为strep&data4,e;到data1或data3会导致分段错误

在这种情况下:

char* found = strsep(&data1, "e");
data1指向的字符串是文本,因此无法更改。当strep试图将“\0”放入其中时,segfault

在另一种情况下:

char* found = strsep(&data3, "e");
data3是一个数组,不是指针,即使数组很容易计算为指针,但它们实际上不是指针,因此strep无法更新指针的值,这是它在找到标记后尝试执行的操作。我从gcc得到以下警告,试图指出这一点:

test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type
将调用中的数据4更改为strep&data4,e;到data1或data3会导致分段错误

在这种情况下:

char* found = strsep(&data1, "e");
data1指向的字符串是文本,因此无法更改。当strep试图将“\0”放入其中时,segfault

在另一种情况下:

char* found = strsep(&data3, "e");
data3是一个数组,不是指针,即使数组很容易计算为指针,但它们实际上不是指针,因此strep无法更新指针的值,这是它在找到标记后尝试执行的操作。我从gcc得到以下警告,试图指出这一点:

test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type