C中的字符串和以Null结尾的字符数组之间真的有什么区别吗
想问一下字符串是以空字符结尾的字符数组是否可以在 c 中互换。喜欢
char string3[] = "abc";
char string4[4] = {'a','b','c',' '};
if(!strcmp(string3,string4)){
printf("yes");
}
连strcmp也给Yes。所以,只有初始化的区别,或者在深处有一些区别。
回答
char string3[] = "abc";
正是缩写
char string4[4] = {'a','b','c',' '};
char string4[4] = {'a','b','c',' '};
并且没有区别。
但是,请注意
// now it's a pointer
// |
// v
char *string3b = "abc";
和
是不等价的。每当您编写字符串并且不使用它初始化数组(指针不是数组)时,编译器都会为您创建一个数组。第一个基本上相当于:
static const char _magic_compiler_variable_for_abc_string[4] = {'a','b','c',' '};
char *string3b = (char*)_magic_compiler_variable_for_abc_string;
所以字符串被分配到其他地方并且string3b只保存一个指向它的指针。因为字符串变量是const(即使指针不是常量),在这种情况下您不能编辑字符串。编译器可能会_magic_compiler_variable_for_abc_string在您编写的任何地方使用相同的内容"abc",也可能会创建单独的内容。