3

floatサイズが2X2から3X3に変化する2D配列を再割り当てするために、次のことを試みました。コードは、のメモリsegfaultを試行しているときにスローします。reallocweights[2]

num_vertices = 2;
float **weights = malloc(num_vertices*sizeof(float *));      // weight array matrix
for(i = 0; i < num_vertices; i++){
    weights[i] = malloc(num_vertices*sizeof(float));
}

num_vertices = 3;
weights = realloc(weights, num_vertices*sizeof(float *));      // weight array matrix
for(i = 0; i < num_vertices; i++){       
    weights[i] = realloc(weights[i], num_vertices*sizeof(float));
}

もちろん、free2Dアレイも可能mallocですが、よりエレガントなソリューションを探していました。何か案は?

4

3 に答える 3

5

問題は、weights[2]再割り当て後にガベージが含まれることですweights

あなたはおそらくこのようなことをしたいと思うでしょう:

new_vertices = 3;
weights = realloc(weights, new_vertices*sizeof(float *));
for(i = 0; i < new_vertices; i++)
{
    if (i >= num_vertices)
        weights[i] = NULL;
    weights[i] = realloc(weights[i], new_vertices*sizeof(float));
}
num_vertices = new_vertices;

reallocが失敗した場合、メモリリークが発生する可能性があることに注意してください。エラーチェックはまだありませんが、これはおそらく今のところ問題ではありません。

于 2012-09-11T06:42:43.037 に答える
3

のreallocは、ポインタが割り当てられていないweights[2]ため、未割り当てのメモリを再割り当てしようとしています。weights[2]

通常、2D配列が必要な場合はwegihts[width*y + x]、ポインタの配列を作成する代わりに、配列にインデックスを付けるために使用します。

于 2012-09-11T06:43:08.330 に答える
2

外側の配列のその部分はまだ割り当てられておらず、初期化されていないデータが含まれているため、新しい頂点カウントにループすることはできません。代わりに、新しいものにループしてnum_vertices - 1再割り当てしてから、新しいものを作成しますweights[num_verticees - 1]

于 2012-09-11T06:43:28.727 に答える