2
int **twoDary = (int**) (malloc(rows * sizeof(int *)));
int **twoDaryStart = twoDary;
int *currentrow;

for ( i = 0; i < rows; i++ ){  // Originally: for (i = 0; i < columns; i++)
    *(twoDary + i) =  (malloc(columns * sizeof(int)));
}

for (j = 0; j < rows; j++) {
    currentrow = *(twoDary + j);
    for ( i = 0; i < columns; i++ ) {
        *(currentrow + i) = i;
        printf("%d\n", *(currentrow+i));
    }
}  

動的な2D配列を作成しようとしています。次に、現在のi(内側のforループ内)であるiをすべての行の各要素に割り当てようとしています。したがって、私の出力は、数値0-列に印刷された行時間である必要があります。

行と列が同じでない場合、つまり5行10列の場合、セグメンテーション違反が発生し続けます。誰かがこのコードからなぜそれが起こるのかを知ることができますか?

4

1 に答える 1

8

最初のループは次のようになります。

for (i = 0; i < rows; i++)
{
    ...
}

どうやらコードには一貫性がありました (しかし間違っていました) — 同じ問題がfree()コードにありました。これが問題の私のSSCCEです。によってクリーンな健康証明書が与えられvalgrindます。

#include <stdlib.h>
#include <stdio.h>

extern int **alloc_array(int rows, int columns);

int **alloc_array(int rows, int columns)
{
    int i;
    int j;
    int **twoDary = (int**) (malloc(rows * sizeof(int *)));
    int **twoDaryStart = twoDary;
    int *currentrow;

    for ( i = 0; i < rows; i++ ){
        *(twoDary + i) =  (malloc(columns * sizeof(int)));
    }

    for (j = 0; j < rows; j++) {
        currentrow = *(twoDary + j);
        for ( i = 0; i < columns; i++ ) {
            *(currentrow + i) = i;
            printf("%d\n", *(currentrow+i));
        }
    }  
    return twoDary;
}

int main(void)
{
    int **d2 = alloc_array(5, 10);

    for (int i = 0; i < 5; i++)
        free(d2[i]);
    free(d2);
    return(0);
}
于 2013-02-05T01:24:26.700 に答える