1

構造体にメモリを自動的に割り当て、その構造体内のフィールドをゼロに設定するプログラムを作成しました。

そのメンバーだけをゼロに設定するのではなく、ブロック全体をゼロにしてみませんか? 入ってきmemset()ます。

この関数を使用した後、私のプログラムは機能しなくなりました。そのメモリ ブロックに含まれる構造内のフィールドに値を代入しようとすると、セグメンテーション違反エラーでプログラムがクラッシュしました。

それで、これは私を不思議に導きます-メモリのブロックがmalloc()/ AUTOを介して割り当てられるとき、このスペースにアクセスして使用するために必要な他の情報がこの場所に保存されていますか?

typedef struct{
    NodeT *nodes[MAX_SIZE];
    int count; 
} stackT;

stackT stack;
stackT* ptr = &stack;

void init(stackT* stackPtr){
    //stackPtr->count = 0;
    memset(stackPtr, 0, sizeof(stackptr));
}
4

4 に答える 4

5

ポインターのサイズではなく、構造体のサイズを渡して memset を実行してください。

memset(stackPtr, 0, sizeof(stackT));

そうは言っても、malloc はアドレス ブロック (N バイトとしましょう) へのポインターを返します。次に、memset とサイズ N に同じポインターを渡す必要があります。malloc によって返されるポインターには、memset を実行することによって影響を受ける可能性のある他の情報は含まれていません。

于 2013-09-11T19:53:16.810 に答える