1

私はコードを持っています:

void Read(int T[], int len) {
    int i;
    T = (int*) malloc(len * sizeof *T);
    for (i=0;i<len;i++) {
        scanf("%d", &T[i]);
    }
}

私はこのように使用します:

int *T;
Read(T,len);

次に、テーブルを書きたい:

void Write(int T[], int len) {
    int i;
    for(i=0;i<len;i++) {
        printf("%d, ", T[i]);
    }
    printf("\n");
    return;
}

そしてそれを使用します:

Write(T,len);   

それは私に間違った結果をもたらします。問題が「 & 」に関連していることはほぼ確実ですが、対処できません。

前もって感謝します

4

3 に答える 3

2

1 つの問題は、関数T内のローカル変数を変更している可能性があります。Read

int *T;
Read(T, len);
// ...

void Read(int T[], int len) {
    int i;
    T = (int*) malloc(len * sizeof *T);
    // ...
}

T内部Readは実数T変数のコピーです。コピーに新しい値を割り当てますが、元の値は変更されません。

実際に outer を変更するには、次のTようにポインターを渡します。

int *T;
Read(&T, len);
// ...

void Read(int **T, int len) {
    int i;
    *T = (int*) malloc(len * sizeof *T);
    for (i=0;i<len;i++) {
        scanf("%d", &(*T)[i]);
    }
}
于 2012-05-26T21:29:36.843 に答える
1

以下を試してください (機能Writeは変更されていません)。

void Read(int T[], int len) {
    int i;
    for (i=0;i<len;i++) {
        scanf("%d", &T[i]);
    }
}

T = (int*) malloc(len * sizeof *T);
Read(T,len);

Write(T,len);   

UPDATE : ただし、メモリを割り当てたい場合はRead、ポインターへのポインターを受け取る必要があります。

void Read(int *T[], int len) {
    int i;
    T = (int**) malloc(len * sizeof **T)

    for (i=0;i<len;i++) {
        scanf("%d", &(*T)[i]); /* not the easiest expression in the language */
    }        
}

Read(&T, len);
Write(T, len);

実際にはRead、ポインターを直接返すように変更する方が簡単ですが、それはあなたが望むものではないかもしれません: int *Read(int len) { ... }.

于 2012-05-26T21:25:21.977 に答える
1

ネイトのソリューションはどれも素晴らしくダンディですが、私は少しエレガントではないと感じています。

C自体はかなり難読化されており、2倍にする理由がわかりません。以下を使用することをお勧めします。

の署名を に変更しvoid Read(int T[], int len)ますint* Read(int T[], int len)

これを行うことには、複数の利点があります。コードが読みやすくなるだけでなく、厄介な読み取りに伴う「隠れた」副作用が(部分的に)取り除かれ、意図が何であるかが明確に示されるため、free()単純に呼び出すことを忘れる可能性が低くなります。ポインターが返されていることがわかりますので、関数内に卑劣な動的割り当てがあった可能性があることを示しています。また、心配する間接化のレベルが 1 つ少なくなります。

次に、次のことができます。

int* Read(int T[], int len) {
    int i;
    T = (int*) malloc(len * sizeof(T));
    for (i=0; i<len; ++i) {
        scanf("%d", &T[i]);
    }
    return T; // Basically the only change!
}

今、あなたを呼び出す関数でRead()

int main() {

const int size = 5;
int *T = 0; // It's not needed to do a prior declaration and initialization
            // but it does silence a warning which is a good thing.
T = Read(T, size);
Write(T, size);

// Do more stuff and free() whenever needed

return 0;
}
于 2012-05-26T21:50:59.420 に答える