正确的行为,尽管没有空字符串终止?

问题描述:

这是我的代码:正确的行为,尽管没有空字符串终止?

#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的字符数组,空留空间空终止。每当我打印出来的时候,我都会得到奇怪的(不可打印的)值(如预期的那样)。然而,我也期待pointer变量的同样的事情,因为它应该缺少空终止符(因为它只有空间4 char,所以没有空间\0。但是,每当我运行这个代码时,some_string总是搞砸了,经过约50次尝试pointer是完全正常的,虽然(从我的观点),没有一个空终止符。为什么在printf()呢?

+2

这是未定义的行为。你的期望不正确。在未定义行为发挥作用时,您无法期待任何特定结果。 – kaylum

+0

一个可能的解释是,在某些系统上,堆管理器只允许某些固定的块大小进行内存分配。因此,也许'malloc(4)'不能正好分配4个字节,并且会从堆管理器获得最少8或16个字节。 –

%s格式说明需要一个空值终止字符串。

在这种情况下,你有不确定行为(UB)有时UB会给出预期结果

附注:

sizeof(char)是一个跨所有平台(1字节)的常量,因此在内存分配过程中无需指定它。