1

セグメンテーション違反を起こす次のコードがありますが、その理由がまったくわかりません。どんな助けでも大歓迎です。

これを行うと、セグメンテーション違反が発生します(すべてが正しく初期化されているかどうかを確認するため)。何も出力されないため、最初の行で segfault が発生します。残念ながら、このコードはアクセスできないサンドボックス内にあるため、valgrind を使用できません。そこで問題を確認することはできません。

for (i = 0 ; i<nb_read ; i++) {

 fprintf(stdout, "Read Lock i %d  %p \n ",i, nap->read_buffer[i]->sem_handle); 
 fprintf(stdout, "Write Lock i %d  %p \n ",i, nap->write_buffer[i]->sem_handle);  
 fprintf(stdout, "Read Buffer i %d  %p \n ",i, nap->read_buffer[i]->buffer); 
 fprintf(stdout, "Write Buffer i %d  %p \n ",i, nap->write_buffer[i]->buffer); 

}

ここで、SharedStruct は char* バッファー メンバーと int sem_handle を持つ構造体です。

SharedStruct** create_buffer(int nb, int size) {
SharedStruct** result = malloc(nb * sizeof(SharedStruct*));
int i = 0 ;
for (i = 0 ; i<nb ; i++) {
        SharedStruct* res= malloc(nb *sizeof(SharedStruct));
        res->buffer = malloc(size * sizeof(char)); 
        int lock = initialise_protection();
        fprintf(stdout, "\n Semaphore initialised to %d \n ", lock);
        res->sem_handle = lock ;
    }
    return result ;
 }
4

2 に答える 2

6

結果に含まれるポインタを初期化していないようです。それらにスペースを割り当てただけで、ループ内でresult [i]=resを実行するのを忘れたようです。

于 2012-08-02T18:55:35.407 に答える
1

初め。コードを正しくインデントする必要があります。そうしないと、独自のコードを読み取ることができません。

次に、エントリをまったく初期化せずに、エントリresultの配列としてnb初期化します。

次に、nb(SharedStruct *)へのポインターを割り当て、そのような構造ごとに、どこにも保持しないバッファーを割り当てます。したがって、後でそれを解放することはできません。

于 2012-08-02T19:03:16.960 に答える