我的理解是这样的:
char *
指向一个字符串常量,修改它指向的数据是未定义的。但是,您可以更改它指向的位置。char[]
指的是您可以更改的内存块。您可以更改其内容,但不能更改它所指的内容。strcpy(dest, src)
将src
复制到dest
中。
我的问题是,使用 strcpy()
时 dest
是一个已经指向的 char *
是否不正确对某些东西(因为我相信旧内容将被 strcpy()
覆盖 - 这是未定义的行为)?
例如:
char *dest = malloc(5);
dest = "FIVE";
char *src = malloc(5);
src = "NEW!";
strcpy(dest, src); /* Invalid because chars at dest are getting overwritten? */
最佳答案
不幸的是,您的理解并不完全正确。
char *
指向字符数据,由于那里没有 const
,您可以写入指向的数据。
但是,完全可以这样做:
char *a = "hello";
这为您提供了一个指向只读数据的读/写指针,因为字符串文字存储在只读内存中,但不是语言语法“考虑”的常量。
最好把上面的写成:
const char *a = "hello";
为了更清楚地说明您不能修改a
指向的数据。
此外,您混合使用 malloc()
和赋值的示例也是错误的。
这个:
char *dest = malloc(5);
dest = "FIVE"; /* BAD CODE */
是糟糕的代码,你永远不应该那样做。它只是用指向字符串 "FIVE"
的指针覆盖 dest
返回的指针,该字符串作为字符串文字存在于(同样是只读的)内存中的某处。
用字符串数据初始化新分配的内存的正确方法是使用strcpy()
:
char *dest = malloc(5);
if(dest != NULL)
strcpy(dest, "five");
请注意,检查 malloc()
的返回值是个好主意。
对同一内存进行多次写入是没有问题的,这是 C 语言中的一个非常基本的想法;变量代表内存,可以通过“改写”在不同的时间赋予不同的值。
简单如:
int a = 2;
printf("a=%d\n", a);
a = 4;
printf("a=%d\n", a);
演示了这一点,它当然也适用于字符串,因为它们只是内存块。
您可以扩展上述基于malloc()
的示例:
char *dest = malloc(5);
if(dest != NULL)
{
strcpy(dest, "five");
printf("dest='%s'\n", dest);
strcpy(dest, "four");
printf("dest='%s'\n", dest);
strcpy(dest, "one");
printf("dest='%s'\n", dest);
}
它会打印:
dest='five'
dest='four'
dest='one'
关于c - 理解 char *、char[] 和 strcpy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502916/