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

一个问题可能是您正在修改函数T内部的局部变量:Read

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

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

内部是真实变量T的副本。您为副本分配了一个新值,但原始值保持不变。ReadT

要实际修改 external 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);   

更新:但是如果你想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

Nate 的解决方案非常好,但我觉得它有点不雅。

C 本身就相当模糊,我看不出有什么理由让它如此之多。我建议您使用以下内容:

将您的签名更改void Read(int T[], int len)int* Read(int T[], int len).

这样做有很多好处。它不仅使您的代码更具可读性,而且还消除了讨厌的读取带来的“隐藏”副作用(部分),并且还清楚地说明了您的意图是什么,因此您不太可能忘记free()简单地调用因为您看到返回了一个指针,所以这暗示函数中可能存在偷偷摸摸的动态分配。你也少了一层需要担心的间接性。

然后您可以执行以下操作:

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 回答