平台:Linux,OSX
编译:GCC
我有一个简单的程序,目前让我感到困惑 - 我知道我正在搞乱几种不同类型的数组/指针来产生这个问题 - 它是故意的 - 我试图理解它。
列出的代码将按预期编译并运行,但在调用data4
到strsep(&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;
}
答案 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