我有一段代码:
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; '有关,但我无法解决。
提前致谢
答案 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()