char*和char []与strcpy()之间的区别

wea*_*key 5 c string char

过去几个小时我遇到了一个问题,虽然我明白了.这是我的麻烦:

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)