Pet*_*org 1 c string memory-management libc
平台: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;
}
Run Code Online (Sandbox Code Playgroud)
在调用strsep(&data4,"e")时更改data4; data1或data3导致分段错误.
在这种情况下:
char* found = strsep(&data1, "e");
Run Code Online (Sandbox Code Playgroud)
指向的字符串data1
是文字,因此无法更改.当strsep()
试图将'\ 0'放入其中时,会发生段错误.
在另一种情况下:
char* found = strsep(&data3, "e");
Run Code Online (Sandbox Code Playgroud)
data3
是一个数组,而不是一个指针(即使数组容易评估为指针,它们实际上不是指针),因此strsep()
无法更新指针的值,这是它在找到令牌后尝试执行的操作.我从gcc那里得到以下警告,试图指出这一点:
test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)