c - 理解 char *、char[] 和 strcpy()

标签 c arrays string pointers strcpy

我的理解是这样的:

  • 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/

相关文章:

python - 是什么导致 numpy.sum 和 numpy.cumsum 之间的性能不同?

c++ - 无法将合并排序设为 O(n log n)

python - SequenceMatcher.ratio 如何在 difflib 中工作

string - 在 Haskell 中替换字符串

c++ - libneo4j-client 无法关闭并重新打开新 session ?

c - 让 gcc 内联并导出函数

c - 图标句柄和资源 ID

c - 为什么我在这个简单的 C 程序上得到这种奇怪的输出?

c++ - 将数字转换为文本,C++

java - 匹配特定索引