我正在尝试为字符串指针赋值。它正在编译并运行但是没有打印正确的答案?
char *x = "girl";
*x = x[3];
printf("%s\n",x);
为什么不打印“lirl”?
答案 0 :(得分:5)
您不能像这样修改字符串文字。这是未定义的行为。
你应该这样做:
char x[] = "girl";
x[0] = x[3];
printf("%s\n",x);
这是有效的,因为"girl"
现在是x[]
的数组初始值设定项。这只是一个简短形式:
char x[] = {'g', 'i', 'r', 'l', '\0'};
所以这是允许的。
答案 1 :(得分:2)
您正在尝试更改一个常量且不可能的字符串文字。
char *x = "girl";
这将存储在可执行文件的一部分中,例如.rodata
部分,您无法写入。
但是,如果你这样做:
char x[] = "girl";
或
char *x;
x = malloc (sizeof (char) * ENOUGH_MEMORY);
strcpy (x, "girl");
然后你可以修改字符串。在x[] = "girl"
情况下,如果.data
是全局的)堆栈,字符串将存储在函数的本地(或全局x
部分)中,并且在malloc
情况下,内存将是从堆中分配给你,x
存储它的基地址。在这两种情况下,您都可以读/写两种类型的位置。
答案 2 :(得分:2)
您正在修改只读内存。不要那样做。
char *x = "girl";
应该是
const char *x = "girl";
“女孩”是只读的,不可修改。如果您需要修改字符串,则将x声明为char[]
,并将分配自动存储持续时间。
char x[] = "girl";
x[0] = 'c'; // legal
答案 3 :(得分:0)
这个表达式 将第4个(索引3)字符从字符串分配给第一个(索引0)。 因此,分配给* x正是为字符串
的第一个元素赋值