【发布时间】:2013-09-18 23:37:38
【问题描述】:
下面的代码有什么区别?
1.
char *p;
strcpy(p,"String");
2.
char *p;
p = "String";
指针指向同一个字符串,但是有区别吗?
【问题讨论】:
下面的代码有什么区别?
1.
char *p;
strcpy(p,"String");
2.
char *p;
p = "String";
指针指向同一个字符串,但是有区别吗?
【问题讨论】:
(1) 是内存乱写,可能是运行时错误。
你不能复制到你不拥有的内存(没有以某种方式分配)。
【讨论】:
为了使第一个操作起作用,p 必须指向一个至少 7 字节大小的可写内存块。第二个操作不需要它。
在第一次操作之后,字符串仍然是可写的:你可以对第一个字符串执行此操作,但不能对第二个字符串执行此操作:
*p= 's'; // Make the value all lowercase
第二个指针赋值将p指向一个字符串字面量的内存;写入该内存是未定义的行为。
【讨论】:
"" 是只读内存中的字符串文字。它占用一个字节,即'\0'。写入它是 UB。
在第一点你说你想把字符串复制到 p 指向的内存块
(所以你必须确保有足够的空间可以复制字符串)
在第二种情况下,您只需让 p 指向“String”的只读地址。
p -> [S][t][r][i][n][g][0]
但你应该得到编译器警告,只要你没有将 p 声明为 p const *
【讨论】: