2016-03-02 71 views
-1

這是我的代碼:正確的行爲,儘管沒有空字符串終止?

#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個字節。 –

回答

1

%s格式說明需要一個空值終止字符串。

在這種情況下,你有不確定行爲(UB)有時UB會給出預期結果

附註:

sizeof(char)是一個跨所有平臺(1字節)的常量,因此在內存分配過程中無需指定它。