首先,我的代码中有一个逻辑错误。好吧,这就是代码
#include <stdio.h>
int main()
{
long i,j,t;
scanf("%ld",&t);
long n[t],d[t][t];
for(i = 0; i < t;i++){
scanf("%ld",&n[i]);
for(j = 0; j < n[i] ;j++){
scanf("%ld",&d[j][i]);
}
}
for(i = 0; i < t;i++){
for(j = 0; j < n[i] ;j++){
printf("%ld ",d[j][i]);
}
printf("\n");
}
return 0;
}
然后我输入数据
2
4
25 20 30 90
3
45 50 55
结果就是
25 20 30 90
45 50 55
嗯,这正是我所期望的。但是,当输入变成这样时
3
5
12 67 89 34 56
6
34 56 78 90 12 34
7
12 34 89 23 56 78 89
结果如下所示
12 34 89 23 56 78 89
12 67 89 34 56 4206692 7 2293472 1982002386 16 3 2293344 2293408 0 2293552 0 0 4
198585 8918456 1982106837 1982010910 8918456 2293640 0 0 1985286516 2009576437 0
0 2293664 2009323341 2293740 2147348480 0
34 56 78 90 12 34 4199405 1982595752 8 12 2293424 2 2 1982356412 2147348480 2293
608 2147348480 1 -1 297753669 1982010784 1982015505 4199044 0 0 2147348480 21473
48480 0 0 0 7273647 2009576392 0 0 0 1 0 20 52 0 0 438759246 736 -214797894 1420
760826203 2272 852421325 3108 944791496 4028 -1322777276 4988 9 1 1 1204 7168 4
2 152 11832 7 1 40 12316 1682469715 1 140 44 0 0 0 2 0 7209065 5701724 6029427
12 34 89 23 56 78 89
那么,简单的问题是,为什么输出会变成上面的样子?当我输入大于2的值时,同样的结果也会发生。如果你不介意的话,有什么可能的答案和链接吗??谢谢
发布于 2012-05-04 12:37:18
在许多情况下,你在2D数组之外编写代码,有时你不会得到错误,但这只是偶然的。
您可以根据要输入的数组的数量来确定2D数组的大小,但同时也要确定内部数组的大小:
scanf("%ld",&t);
long n[t],d[t][t];
举个例子,让我们看第一个例子:
2 >> create array n[2], and array d[2][2]
4 >> number of values to d[0]
25 20 30 90 >> d[0][1] = 25 d[0][2] = 20 you access d[0][3] and d[0][4] but you are not allowed to do that.
3 >> number of values to d[1]
45 50 55 >> d[1][0] = 45 d[1][1] = 50 you access d[1][2] but you are not allowed to do that
发布于 2012-05-04 12:38:16
构建一个大小为t*t
的矩阵,然后用或多或少的元素填充各行。
如果您用太少的元素填充一行,其余的将保持未初始化状态,并且您会得到奇怪的数字。在您的情况下,这是可以的,因为您不打印这些元素。
如果用过多的元素填充一行,则多余的元素会重叠到下一行。它还可能超过整个矩阵并损坏堆栈。
我猜这就是发生的事情--您的n
数组溢出,并且您的代码变得疯狂。
发布于 2012-05-04 17:16:23
我相信你可以使用malloc
。
#include <stdio.h>
#include <stdlib.h>
int main()
{
long i,j,t;
printf("Rows : ");
scanf("%ld",&t);
long *n;
long **d;
n = (long* )malloc(sizeof(long) * t); // add malloc
d = (long** )malloc(sizeof(long *) * t); // add malloc
for(i = 0; i < t;i++){
printf("Column : ");
scanf("%ld",&n[i]);
d[i] = (long* )malloc(sizeof(long) * n[i]); //add malloc
if(d[i] == NULL)
printf("ERROR\n");
for(j = 0; j < n[i] ;j++){
scanf("%ld", &d[i][j]); // change from &d[j][i]
}
}
printf("\n\n");
for(i = 0; i < t;i++){
for(j = 0; j < n[i] ;j++){
printf("%ld ",d[i][j]); // change from d[j][i]
}
printf("\n");
}
return 0;
}
嗯,简单的问题是,为什么输出会像上面这样?当我输入大于2的值时,同样的结果也会发生。如果你不介意的话,有什么可能的答案和链接吗??谢谢
因为你分配的内存比used.
scanf("%ld", &d[j][i]);
少,所以你必须交换"i“和”j“。https://stackoverflow.com/questions/10442752
复制相似问题