动态内存位置C - 参数int *

时间:2012-05-26 21:17:56

标签: c memory

我有一段代码:

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);   

它给了我错误的结果。我几乎可以肯定这个问题与'&amp; '有关,但我无法解决。

提前致谢

3 个答案:

答案 0 :(得分:2)

一个问题可能是您在T函数中修改了局部变量Read

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

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

T内的Read是真实T变量的副本。您为副本指定了一个新值,但原始值保持不变。

要实际修改外部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]);
    }
}

答案 1 :(得分: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) { ... }

答案 2 :(得分:1)

Nate的解决方案一切都很好而且花花公子但我觉得它有些不雅。

C本身是相当混淆的,我没有理由为什么要这么做两倍。我建议你使用以下内容:

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

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

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

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()