2017-10-18 5 views
2

誰もが: 私は2Dの行列をCで割り振るアプローチを見つけました。それを練習しながら、未知のバグについては混乱します。私は、このバージョンで問題ありません動的に割り当てられた2D空間のメモリ管理

//first version 
static int ** my2DAlloc(int rows, int cols){ 
    int ** array; 
    int * array_head; 
    int i; 
    int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1; 
    array = (int**)malloc(len); 
    memset(array, 0, len); 

    array_head = (int *) (array + rows); 
    for(i=0; i<rows; i++) 
     array[i] = array_head + i*cols ; 

    return array; 
} 

:ここ

は機能、最初のバージョンです。しかし、私は次のように、少しのコードを変更しようとしました:

//second version 
static int ** my2DAlloc(int rows, int cols){ 
    int ** array; 
    int * array_head; 
    int i; 
    int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1; 
    array = (int**)malloc(len); 
    memset(array, 0, len); 

    //array_head = (int *) (array + rows); 
    for(i=0; i<rows; i++) 
     array[i] = (int *) (array + rows + i*cols); // <--- the major difference 

    return array; 
} 

この第二のバージョンに関しては、行列にデータを書き込み、データを読み出すために罰金です。 しかし、私は割り当てられた領域を解放しようとしたときのように、私はシステムエラーを取得:いくつかのメモリエラーのようです

free(): invalid next size (fast): 0x00000000020df010 

。しかし、私は問題を理解することができませんでした。 誰か助けてくれますか?あなたは算術外のキャストを持っているので、&よろしく

+0

スペースを空けたところでコード行をどのように記述しますか? –

+0

'配列'は 'int **'です。 'array_head'は' int * 'です。どちらも違います。 – BLUEPIXY

+0

本当にintのポインタへのポインタを返そうとしていますか?のように、intポインタの配列を探していますか? – jwdonahue

答えて

3

おかげで第二のバージョンでの問題は、あなたがint **代わりのint *にポインタ演算をやっているということです。

for(i=0; i<rows; i++) 
    array[i] = ((int *)(array + rows) + i*cols); // <--- the major difference 
+0

こんにちは、バーマ、あなたは問題を指摘していただきありがとうございます。 – MyCoy

関連する問題