我有下面的程序。我不能理解到底发生了什么。它打印了一个额外的元素,我一定是个垃圾人?为什么做不到?请帮帮我!
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int i = 0, j=0;
int *ptr = &n;
for(i=0; i<3; i++)
for(j=0; j<9; j++)
{
printf("%d\t",*((ptr+i)+j)) ;
}
system("pause");
return 0;
}发布于 2014-01-10 13:10:52
这根本不是访问二维数组元素的方式。首先,您同时遍历i和j -但是由于您将j从0传递到8,当您遇到值i>0时,您将遇到麻烦。你可以这样做
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int j=0;
int *ptr = &n[0][0];
for(j=0; j<9; j++)
{
printf("%d\t",*(ptr+j)) ;
}
return 0;
}它稍微简单一点,但保留了代码的精髓--它设置了一个指向数组开头的指针,并递增这个指针。
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int j=0;
int *ptr = &n[0][0];
for(j=0; j<9; j++)
{
printf("%d\t",*(ptr++)) ;
}
return 0;
}或
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int i, j;
int *ptr = &n[0][0];
for(i=0; i<9; i+=3)
{
for(j=0; j<3; j++)
{
printf("%d\t",*(ptr+i+j)) ;
}
}
return 0;
}#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int i, j;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("%d\t",n[i][j]);
}
}
return 0;
}看看这些不同的方法对你是否有意义。如果他们不这样做,就问问题。
编辑对程序的简单修改可以更好地显示原始代码中的错误是什么:
#include <stdio.h>
int main(){
int i, j;
for(i=0; i<3; i++)
for(j=0; j<9; j++)
{
printf("i = %d; j = %d; i + j = %d\n", i, j, i+j);
}
return 0;
}它在内部循环中打印出i和j的值(您尝试依次打印数组元素的地方)。你会得到:
i = 0; j = 0; i + j = 0
i = 0; j = 1; i + j = 1
i = 0; j = 2; i + j = 2
i = 0; j = 3; i + j = 3
i = 0; j = 4; i + j = 4
i = 0; j = 5; i + j = 5
i = 0; j = 6; i + j = 6
i = 0; j = 7; i + j = 7
i = 0; j = 8; i + j = 8
i = 1; j = 0; i + j = 1
i = 1; j = 1; i + j = 2
i = 1; j = 2; i + j = 3
i = 1; j = 3; i + j = 4
i = 1; j = 4; i + j = 5
i = 1; j = 5; i + j = 6
i = 1; j = 6; i + j = 7
i = 1; j = 7; i + j = 8
i = 1; j = 8; i + j = 9
i = 2; j = 0; i + j = 2
i = 2; j = 1; i + j = 3
i = 2; j = 2; i + j = 4
i = 2; j = 3; i + j = 5
i = 2; j = 4; i + j = 6
i = 2; j = 5; i + j = 7
i = 2; j = 6; i + j = 8
i = 2; j = 7; i + j = 9
i = 2; j = 8; i + j = 10正如您所看到的,您打印了太多的元素,并且您“掉到了边缘”,因为当i + j >8时,您访问的内存超出了分配的内存。
https://stackoverflow.com/questions/21036506
复制相似问题