过去几个小时我遇到了一个问题,虽然我明白了.这是我的麻烦:
void cut_str(char* entry, int offset) {
strcpy(entry, entry + offset);
}
char works[128] = "example1\0";
char* doesnt = "example2\0";
printf("output:\n");
cut_str(works, 2);
printf("%s\n", works);
cut_str(doesnt, 2);
printf("%s\n", doesnt);
// output:
// ample1
// Segmentation: fault
Run Code Online (Sandbox Code Playgroud)
我觉得char*/char []有一些重要的东西,我没有来到这里.
das*_*ght 11
区别在于doesnt指向属于字符串常量的内存,因此不可写.
当你这样做
char works[128] = "example1\0";
Run Code Online (Sandbox Code Playgroud)
编译器将不可写字符串的内容复制到可写数组中.\0顺便说一句,这不是必需的.
但是,当你这样做时,
char* doesnt = "example2\0";
Run Code Online (Sandbox Code Playgroud)
编译器使指针指向不可写的内存区域.再次,\0将由编译器插入.
如果您正在使用gcc,您可以让它警告您char *使用字符串文字初始化可写.选项是-Wwrite-strings.您将收到如下警告:
warning: initialization discards qualifiers from pointer target type
Run Code Online (Sandbox Code Playgroud)
声明doesnt指针的正确方法如下:
const char* doesnt = "example2\0";
Run Code Online (Sandbox Code Playgroud)