我有以下计划。我无法理解发生了什么。它打印了一个额外的元素,我必须是一个转储人?不能成功为什么?请帮帮我!
#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;
}
答案 0 :(得分:3)
这完全不是如何访问2D数组的元素。这里有几个问题。首先,您正在循环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
&gt; 8您正在访问超出已分配内存的内存。这导致了未定义的行为。但这通常是一件坏事。