使用strcpy和等号运算符进行字符串赋值

4
以下代码有何不同?
1.
char *p;
strcpy(p,"String");

2.

char *p;
p = "String";

指针指向相同的字符串,但是有什么区别吗?
3个回答

6
为了使第一个操作能够正常工作,p必须指向至少7字节大小的可写内存块。而第二个操作不需要这样。
第一个操作后字符串仍然是可写的:你可以在第一个字符串上执行此操作,但不能对第二个字符串执行。
*p= 's'; // Make the value all lowercase

第二个指针赋值将 p 指向字符串常量的内存;写入该内存是未定义行为。

@MitchWheat 你是对的 :) - Sergey Kalinichenko
你的回答更好。 - Mitch Wheat
如果你说p = "",这是否适用?空字符串是否被视为只读内存中的字符串字面量? - rasen58
@rasen58 是的,""是一个只读内存中的字符串字面量。它占用一个字节,即'\0'。对其进行写操作是未定义行为。 - Sergey Kalinichenko

1

(1)是内存乱写,可能会导致运行时错误。

你不能将数据复制到你没有拥有的内存中(即没有以某种方式分配内存)。


1
在第一点中,您说您希望将字符串复制到p指向的内存块中(因此您必须确保有足够的空间可用于复制字符串)。
在第二种情况下,您只需使p指向“String”的只读地址。 p -> [S][t][r][i][n][g][0] 但是,只要您没有将p声明为p const *,您应该会收到编译器警告。

因此,在第一个字符串被复制到另一个位置后,地址被分配给指针。 但在第二个字符串中,直接将地址赋值给p。 - Devraj Jaiman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接