我知道C语言有动态长度字符串,因此它使用特殊字符null(表示为0)来终止字符串 - 而不是保持长度。
我有这个简单的C代码,它在第五个索引中创建一个带有空字符的字符串:
#include <stdio.h>
#include <stdlib.h>
int main () {
char * s= "sdfsd\0sfdfsd";
printf("%s",s);
s[5]='3';
printf("%s",s);
return 0;
}
因此,字符串的打印将仅输出到第五个索引。然后代码将第五个索引处的字符更改为&#39; 3&#39;。鉴于我的理解,我认为它将使用3而不是null来打印完整的字符串,如下所示: sdfsdsdfsd3sfdfsd
但它输出: sdfsdsdfsd
有人可以解释一下吗?
答案 0 :(得分:2)
此程序显示未定义的行为,因为您修改了只读字符串文字。 char* s = "..."
使s
指向常量内存; C ++实际上不允许将非const char*
指向字符串文字,但在C中它仍然可能,我们必须小心(有关更多详细信息,请参阅this SO answer和C99标准引用)< / p>
将作业行更改为:
char s[] = "sdfsd\0sfdfsd";
在堆栈上创建一个数组并将字符串复制到它,作为初始化程序。在这种情况下,修改s[5]
是有效的,您将获得预期的结果。
答案 1 :(得分:1)
此操作失败:
s[5] = 3;
您正在尝试更改字符串文字,它始终是只读的。我的测试显示该程序退出了segfault:
Segmentation fault (core dumped)
在尝试更改它之前,您应该将它存储在数组(或已分配的内存)中:
char s[] = "sdfsd\0sfdfsd";
通过上述更改,程序按预期工作。
答案 2 :(得分:1)
无法更改字符串文字,因为编译器将字符串文字放入只读数据部分(但这可能因底层平台而异)。尝试修改字符串文字的效果未定义。
在您的代码中:
char * s= "sdfsd\0sfdfsd"
这里,s
是指向存储在只读内存中的字符串"sdfsd\0sfdfsd"
的char指针,使其成为不可变的。
在这里,您尝试修改只读内存的内容:
s[5]='3';
导致未定义的行为。
相反,您可以使用char []:
#include <stdio.h>
int main () {
char a[] = "sdfsd\0sfdfsd";
char * s = a;
printf("%s",s);
s[5]='3';
printf("%s\n",s);
return 0;
}
答案 3 :(得分:-1)
#include <stdio.h>
int main(){
char x[10] = "aa\0a";
x[2] = '1';
puts(x);
printf("\n\n\nPress any key to exit...");
getch();
return 0;
}
输出:aa1a