理解char*,char []和strcpy()

CS *_*ent 4 c arrays string pointers strcpy

我的理解如下:

  • char *指向一个字符串常量,修改它指向的数据是未定义的.但是,您可以更改指向的位置.

  • char[] 指内存块,您可以更改其内容但不能更改其内容.

  • strcpy(dest, src)复制srcdest.

我的问题是,这是不正确的使用strcpy()dest作为一个char * 在已经指向的东西(我beleive旧的内容将被覆盖strcpy()-这是不确定的行为)?

例如:

char *dest = malloc(5);
dest = "FIVE";

char *src = malloc(5);
src = "NEW!";

strcpy(dest, src); /* Invalid because chars at dest are getting overwritten? */
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 11

不幸的是,你的理解并不完全正确.

char *指向字符数据,因为那里没有 const,你可以写入指向的数据.

但是,完全可以这样做:

char *a = "hello";
Run Code Online (Sandbox Code Playgroud)

它为您提供了对只读数据的读/写指针,因为字符串文字存储在只读存储器中,但不会被语言的语法"考虑"为常量.

将上述内容写成:

const char *a = "hello";
Run Code Online (Sandbox Code Playgroud)

更清楚地说明您无法修改指向的数据a.

此外,您的示例混合malloc()和分配是​​错误的.

这个:

char *dest = malloc(5);
dest = "FIVE"; /* BAD CODE */
Run Code Online (Sandbox Code Playgroud)

是不好的代码,你永远不应该这样做.它只是dest用指向字符串的指针覆盖返回的指针,该字符串"FIVE"存在于(再次,只读)内存中作为字符串文字的位置.

使用字符串数据初始化新分配的内存的正确方法是使用strcpy():

char *dest = malloc(5);
if(dest != NULL)
  strcpy(dest, "five");
Run Code Online (Sandbox Code Playgroud)

请注意,检查返回值malloc()是个好主意.

对同一个内存执行多次写操作没有问题,这是C中的一个非常基本的想法; 变量代表存储器,并且可以通过"写入"在不同时间给出不同的值.

简单的事情:

int a = 2;

printf("a=%d\n", a);
a = 4;
printf("a=%d\n", a);
Run Code Online (Sandbox Code Playgroud)

演示了这一点,当然它也适用于字符串,因为它们只是内存块.

您可以扩展上面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);
}
Run Code Online (Sandbox Code Playgroud)

它会打印:

dest='five'
dest='four'
dest='one'
Run Code Online (Sandbox Code Playgroud)

  • “不幸的是,您的理解并不完全正确。” 是这么认为的。我在这里学习,我指望是正确的:) (2认同)