为什么strcpy在数组大小不可变时起作用,C

时间:2018-02-11 07:37:24

标签: c arrays c-strings strcpy

所以我参加了我大学的初级水平系统课程,我的教授提到数组大小无法更改,因为它们是在内存中设置的。

此外,C中的字符串只是字符数组。

所以我的问题是,当长度本身无法更改时,如何使用strcpy复制不同长度的字符串?

(目前凌晨2:30,并在1天内完成考试)

道歉这是一个初学者的问题,但非常感谢任何帮助!!谢谢:)

1 个答案:

答案 0 :(得分:5)

简单的答案是,即使我们使用strcpy复制字符串,事实也不会改变。声明后,数组的大小不会改变。实际上假设你有一个char数组

char arr[]="helloworld"; //size of the array will be 11
strcpy(arr,"funny");

阵列的大小是多少?它与声明时相同。 11。它没有改变原来的。

字符串的长度是多少?现在是5

String是以null结尾的char数组。这意味着数组可能有100个元素,但字符串将是一些空终止的字符,它可以是任何例如2长度或5长度或任何可能的东西,因为我们有留下用于存储\0的空间。

复制字符串并不意味着数组大小会发生变化。

还要注意一件事 - 字符串不仅仅是字符数组,它是这些字符末尾的NUL终结符,使其成为字符串。

char s[4]="hell";

这是合法的C代码,这不是字符串。 \0没有空间。您不能将它与标准字符串库函数一起使用。问题是这不适用于strcpystrlen等函数。因为这些实现依赖于NUL终止的字符数组才能正常工作。

请注意显示的最后一个示例 - 写这是Undefined behavior

char s[4]="hell";
size_t len = strlen(s);

不,你不能那样做。 strlen期待一些东西而你却没有给它一个。所以正确的说法是 - (这里有一个很好的描述性引用,我不记得来源)

  

中,字符串不是固有类型。 C字符串是具有一维字符数组的约定   由'\0'以空字符结尾。

1)不记得引用的来源:如果有人确实让我知道。我把它保存在一个文件中。(不是主要来源)