尽管没有以空字符结尾的字符串,但是正确的行为?

时间:2016-03-02 05:11:17

标签: c string

这是我的代码:

#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完全正常,尽管(从我看来)没有空终结符。为什么会这样?

1 个答案:

答案 0 :(得分:1)

%s中的

printf()格式说明符需要以空字符结尾的字符串。

在这种情况下,您有未定义的行为(UB)。有时UB会给出预期的结果。

旁注:

sizeof(char)是所有平台上的常量(1个字节),因此在内存分配期间无需指定它。