2016-04-14 135 views
-1

我有動態內存分配的奇怪問題。 每當我動態地分配一個結構的成員只有一個int我可以給我們寫很多我想要的而不是像普通變量那樣只有一個int而不是數組。 這是我的一些評論代碼,也許你能告訴我在做什麼錯誤或我跳過了點什麼:C動態成員結構

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int *sign_h; 
    int max_chars; 
} myformat; 

int main() 
{ 
    myformat *myfile=malloc(sizeof(myformat)); // one struct 
    myfile->max_chars=100; 
    myfile->sign_h=malloc(1*sizeof(int)); //size of one int 
    myfile->sign_h[333]=50; //Is this suppose to work? 
    printf("test %d",myfile->sign_h[333]); // printf print value of 50 
    FILE* f1=NULL; 
    char nume[]="myfile.bin"; 
    f1=fopen(nume,"wb"); 
    fwrite(&myfile,sizeof(myformat),1,f1); 
    fclose(f1); 
    return 0; 
} 

PS:又是怎麼回事C++?如果我用C++編寫它,我會得到不同的結果?

+5

恭喜你,你已經發現緩衝區溢出 –

+0

未定義的行爲是未定義的。 – EOF

+2

語言不會阻止你在腳下射擊自己,所以你有責任避免這樣做。 – jamesdlin

回答

3

C不關心你是否寫出數組的末尾,它只是遵循命令。當你調用

myfile->sign_h[333]=50; //Is this suppose to work? 

你真正做的是說,「寫50到4個字節是sign_h在內存中的位置之後333 * sizeof(int)字節; C說,‘OK,做完’,不管。後果

後果的說到,可能有許多負面的做那,包括:

  1. 如果您再次調用malloc的,它可能給你回的內存塊包含,你只寫給記憶,如果是這樣,你可能會破壞價值你剛纔寫道。如果你以前打電話給malloc,這也可能發生。
  2. 你可以segfault。 Malloc擁有自己的數據結構,用於維護分配給用戶的內存塊信息。通過寫入一些隨機的,任意的空間,你可能會破壞malloc的數據結構。

基本上,不要使用你沒有要求的記憶。