您可以查看此代码:
#include<stdio.h>
int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[0][i]=12-i;
printf("a[0][%i] = %i\n", i, a[0][i]);
}
return 0;
}
它正确地打印从12到1的数字。但是这段代码:
#include<stdio.h>
int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[i][0]=12-i;
printf("a[%i][0] = %i\n", i, a[i][0]);
}
return 0;
}
它打印12,11,10,1,2,1。可能是什么问题?我知道你可以使用2个循环和变量来打印它,但我正在尝试学习如何这样做。
答案 0 :(得分:3)
在这两种情况下,你在做什么都是不好的做法。你很幸运,第一种方式可行(因为大小为4的3个子阵列在内存中是连续的)。
如果你想在一维循环中使用二维数组,你应该使用两种整数除法:/
和%
:
int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[i/4][i%4]=12-i;
printf("a[%i][%i] = %i\n", i/4, i%4, a[i/4][i%4]);
}
return 0;
}
例如,对于i = 7
,我们有i/4 == 1
('划分并向下舍入到整数')和i%4 == 3
('除法后的余数')。
答案 1 :(得分:0)
它与数据存储在内存中的方式有关。在第一种情况下,您按顺序添加它们,它有3 * 4 = 12个元素的空间。因此,您可以幸运地将所有元素放入其中,因为您完全拥有3 * 4个单元格。在第二种情况下,您试图仅将数据放在每一行的第一个单元格上,但是您没有指示空间为12,表示有3行。 有关多维数组中内存的更多信息,请查看此处:
答案 2 :(得分:-1)
+---------------------------------------------------------------------------------+
| a[0][0] <--a[0][1] <--a[0][0] |
| a[0][1] <--a[0][2] |
| a[0][2] <--a[0][3] |
| a[0][3] . |
| a[1][0] . <--a[1][0] |
| a[1][1] . |
| a[1][2] . |
| a[1][3] . |
| a[2][0] . <--a[2][0] |
| a[2][1] . |
| a[2][2] <--a[0][10] |
| a[2][3] <--a[0][11] |
| ^ ^ <--a[3][0] <-- already memory overflow ! |
| | | . |
| array memory Y 1th code . |
| others all memory overflow! |
| |
| you 2th code |
+---------------------------------------------------------------------------------+
因此,您可以使用a[i/4][i%4]
确保没有内存溢出。
让我说:当然你的第一个代码是正确的,我不认为这是运气。在C中,二维数组总是只放两个一维的聚集。但是,请参阅我的downvote,使用它并不好。
如果你真的需要速度,你不想要/
和&#39;%&#39;我想你仍然可以使用cide 1。