Turbo C strcpy库函数

时间:2011-05-27 03:43:27

标签: c string strcpy turbo-c

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

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

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

buffer = "Dante";

如果我没弄错的话,C对待的字符串远比BASIC更像数组。

6 个答案:

答案 0 :(得分:9)

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

考虑一下:

char* buffer;

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

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

答案 1 :(得分:3)

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


如果您问为什么语法不是这样的:那么,如果长度不同会发生什么?

答案 2 :(得分:3)

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

char buffer[20];

编译时间等同于

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

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

buffer = "Dante"; // error 'buffer' address is not modifiable

答案 3 :(得分:2)

当您编写buffer时,它被视为指向数组第一个元素的指针。当然,*bufferbuffer[0]是第一个元素。由于buffer只是一个指针,因此您无法为其分配一大堆数据,如"Dante"

答案 4 :(得分:2)

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

现在你可以做......

char buffer[10] = "Dante";

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

char buffer[] = "Dante123456678";

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

char buffer[];

buffer = "Dante";

答案 5 :(得分:2)

  • 如果char buffer[128];是声明,则buffer引用数组的第一个位置,因此buffer =“Dante”将尝试分配字符串的地址到存储在数组中的地址。数组中的内存地址位置是只读的,并在编译时静态分配。因此,您无法执行buffer = "Dante",因为它尝试更改指向编译时固定的其他位置的地址位置。这些位置无法写入。

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

  • 如果您执行char arr[] = "Dante";字符串“Dante”存储在您可以编写的.text部分,那么arr[0] = 'K'就像这样,即可以进行修改。< / p>

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