2

テーブルの行を表す構造があります。

typedef struct {
    char *a;
    char *b;
} row;

そして、dbデータに基づいてその行を初期化し、その行へのポインタを返す関数があります

row* get_row(dbrow d) {
    row *r = malloc(sizeof(row));
    r->a = malloc(5);
    strcpy(r->a, d.a);
    r->b = malloc(5);
    strcpy(r->b, d.b);
    return r;
}

そして最後に、パラメータとしてを持っている関数がありrow **rowsます:

void get_rows(row **rows) {
    ...
    rows = malloc(rowNumber * sizeof(row*));
    int i;
    for (i = 0; i < rowNumber; i++) {
        rows[i] = get_row(dbrow);
    }
}

get_rowは期待どおりに機能し、有効な行構造体へのポインターを返しますが、gdbは、rows [0](および他のすべて)が新しい値を取得しないことを示していますrows[i] = get_row(dbrow)。存在しません。

4

2 に答える 2

5

... gdbは、rows [0](および他のすべて)が新しい値を取得しないことを示しています...

get_rowsここでは、ローカル変数の値ではなく、関数の戻り値を見ていると仮定していますrows。ここに問題があります:

rows = malloc(rowNumber * sizeof(row*));

関数が受け取った元のポインターのコピーに、元のポインターではなく、新しい値を割り当てています。この変更は、関数の外部には表示されません。

引数に新しい値を割り当てる必要がある場合は、別のレベルの間接参照を追加する必要があります。覚えて; Cのすべてが値によって渡されます。したがって、関数はrow***引数としてaを取る必要があります。

void get_rows(row ***rows) {
    if(!rows) {
        signal_some_error();
        return;
    }
    ...
    *rows = malloc(rowNumber * sizeof(row*));
    ...
}

また、user1700513が指摘したrow*ように、行にを割り当てています。コンパイラエラーが発生するため、実際のコードにすることはできません。

于 2012-10-02T19:04:23.400 に答える
3

に変更row r = malloc(sizeof(row));row* r = malloc(sizeof(row));ます。これについてコンパイラの警告が表示されなかった理由が不思議です。

于 2012-10-02T19:04:50.977 に答える