-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()
呢?
這是未定義的行爲。你的期望不正確。在未定義行爲發揮作用時,您無法期待任何特定結果。 – kaylum
一個可能的解釋是,在某些系統上,堆管理器只允許某些固定的塊大小進行內存分配。因此,也許'malloc(4)'不能正好分配4個字節,並且會從堆管理器獲得最少8或16個字節。 –