#include <stdio.h>
#include <string.h>
int main()
{
char x[] = "Happy birthday to You";
char y[25];
char z[15];
printf("The string in array x is: %s\nThe string in array y is: %s\n", x, strcpy(y, x));
strncpy(z, x, 14);
z[14] = '\0'; // Why do I need to do this?
printf("The string in array z is: %s\n", z);
return 0;
}
z
?z[20] = '\0';
的事情,它会编译并显示结果而没有任何错误。当我声明我的z
数组大小为 15 时,这不是非法访问内存吗?C 语言没有本地字符串类型。在 C 中,字符串实际上是由空字符终止的一维字符数组\0
。
为什么我需要
NUL
在数组中附加一个字符z
?
C 库函数,如strcpy()/strncpy()
对以空字符结尾的字符数组进行操作。strncpy()
最多将count 个字符从源复制到目标。如果找到终止空字符,则将其复制到目的地并返回。如果在复制整个源数组之前达到计数,则生成的字符数组不是空终止字符,您需要在目标末尾显式添加空终止字符。
我也评论了那行,输出没有改变,为什么?
我只能说你很幸运。也许目的地的最后一个字符(即z[14]
)可以包含所有位0
。但是每次运行程序时可能不会发生这种情况。确保在使用strncpy()
或使用其他 C 库函数时显式添加空终止字符,这些函数会自动为您执行此操作snprintf()
。
如果我做类似的事情
z[20] = '\0'
;它正在编译并向我显示结果,没有任何错误。当我声明我的z
数组大小为 15 时,这不是非法访问内存吗?
数组的大小z
是15
并且您正在访问,z[20]
即访问z
超出其大小的数组。在 C 中,越界访问数组是未定义的行为。未定义的行为包括程序可能不正确地执行(崩溃或静默地生成不正确的结果),或者它可能偶然地完全按照程序员的意图执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句