这是我的代码:
#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv) {
char some_string[4] = "ball";
char * pointer = malloc(sizeof(char) * 4);
strncpy(pointer, some_string, sizeof(char) * 4);
printf("String is %s\n", some_string);
printf("String in the pointer is %s\n", pointer);
return 0;
}
这里我故意声明了一个大小为4的char数组,并没有为null终止符留空间。每当我打印出来时,我都会在其末尾附加奇怪的(不可打印的)值(如预期的那样)。但是,我也期望pointer
变量具有相同的功能,因为它应该缺少空终止符(因为它只有4 char
的空格,所以\0
没有空格。但是,每当我运行这段代码,some_string
总是搞砸了,但是经过大约50次尝试pointer
完全正常,尽管(从我看来)没有空终结符。为什么会这样?
答案 0 :(得分:1)
%s
中的 printf()
格式说明符需要以空字符结尾的字符串。
在这种情况下,您有未定义的行为(UB)。有时UB会给出预期的结果。
旁注:
sizeof(char)
是所有平台上的常量(1个字节),因此在内存分配期间无需指定它。