2016-04-14 10 views
-1

私は動的メモリ割り当てに奇妙な問題があります。 構造体のメンバーを1つだけ動的に割り当てるときはいつも、配列ではなく通常の変数のように1つではなく、たくさん書くことができます。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? 

を呼び出すときに何が本当に、言ってやっている「メモリ内のsign_hの場所後の333 * sizeof(int)バイトが4バイトに50を書き込みます。Cは、言う 『OK、』行って、かかわらず。あなたはmalloc関数への別の呼び出しを行う場合

  1. 、それはあなただけ含まれているメモリのブロックをあなたに戻って与えるかもしれない:結果結果の

    いえば、を含む、ことをやってから、多くの否定的なものがあるかもしれませんメモリに書き込んだ場合、その値を壊す可能性がありますあなたはただ書きました。以前にmallocを呼び出していた場合、これも同様に起こります。

  2. セグメンテーションできます。 Mallocは、ユーザーに割り当てられたメモリのブロックに関する情報を維持するための独自のデータ構造を持っています。無作為な任意のスペースに書き込むことで、mallocのデータ構造が壊れている可能性があります。

基本的に、あなたが求めていないメモリは使用しないでください。

関連する問題