0

我发现 strcpy 函数只是将一个字符串复制到花药中。例如,如果一个程序包含以下语句:

char buffer[10];
----------
strcpy(buffer, "Dante");

字符串“Dante”将被放置在数组 buffer[] 中。该字符串将包含终止的 null ( \0 ),这意味着将复制总共六个字符。我只是想知道为什么我们不能更简单地通过说来达到同样的效果?

buffer = "Dante";

如果我没记错的话,C 将字符串视为比 BASIC 更像数组。

4

6 回答 6

9

因为字符串不是 C 中的数据类型。“字符串”是char*s,所以当您尝试分配它们时,您只是将内存地址而不是字符复制到缓冲区中。

考虑一下:

char* buffer;

buffer = malloc(20);
buffer = "Dante";

为什么要神奇地将“Dante”放入缓冲区?

于 2011-05-27T03:47:15.943 回答
3

因为 C 中的“数组”是一块内存。没有可分配的指针。


如果你问为什么语法不是这样:好吧,如果长度不同会发生什么?

于 2011-05-27T03:46:15.450 回答
3

数组的地址不可更改。在其他意义上,你可以考虑,

char buffer[20];

编译时间等价于,

char* const buffer = (char*)malloc(20);

现在,由于buffer地址无法更改,因此无法执行以下操作:

buffer = "Dante"; // error 'buffer' address is not modifiable
于 2011-05-27T04:03:20.780 回答
2
  • 如果char buffer[128];是声明,则buffer引用数组的第一个位置,因此 buffer = "Dante" 将尝试将字符串的地址分配给存储在数组中的地址。数组中的内存地址位置是只读的,编译时静态分配。因此,您不能这样做buffer = "Dante",因为它试图更改指向在编译时固定的其他位置的地址位置。无法写入这些位置。

  • 如果char *buffer;是声明,那么buffer是一个指向类型变量的指针,该char类型变量可以指向一个主要的内存块块。所以当你把字符串buffer = "Dante"的地址变成. 当您打印它时显示字符串,因为它指向一个字符串起始地址,该地址被编译并存储在可执行文件中。但这不是首选方法。buffer

  • 如果你这样做char arr[] = "Dante";,字符串“Dante”就会被存储在.text你可以写的部分,所以arr[0] = 'K'像这样的东西,即修改是可能的。

  • 如果这样做,char *arr = "Dante";则字符串“Dante”将存储在.rodata不可写的或类似位置。这是因为字符串文字不能按照标准进行修改。

于 2011-05-27T05:45:25.580 回答
2

当您编写buffer时,它被视为指向数组第一个元素的指针。当然,*buffer还是buffer[0]第一要素。由于buffer只是一个指针,因此您不能将一大堆数据分配"Dante"给它。

于 2011-05-27T03:48:26.417 回答
2

你不能这样做buffer = "Dante",因为 C 中没有“字符串”数据类型,只有数组。

现在你可以做...

char buffer[10] = "Dante";

但如果字符串的长度未知,你可以这样做......

char buffer[] = "Dante123456678";

但仅在初始化期间,这意味着你不能做......

char buffer[];

buffer = "Dante";
于 2011-05-27T03:57:45.203 回答