分配值时字符串指针错误?

时间:2011-10-30 19:08:00

标签: c

我正在尝试为字符串指针赋值。它正在编译并运行但是没有打印正确的答案?

char *x = "girl"; 
*x = x[3];
printf("%s\n",x);  

为什么不打印“lirl”?

4 个答案:

答案 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正是为字符串

的第一个元素赋值