我已经在这里找到了答案,但我找不到适合我案例的东西。
我有一个函数make_array(),它生成一个二维数组,并且必须用零填充它。 在main()中调用此函数并打印值时,会有一个奇怪的输出,这在其他机器上是不可重现的......
[...]
Valuearray[0][13]: 0
Valuearray[0][14]: 65
Valuearray[0][15]: 0
[...]
数组的其余部分包含零。 正在寻找我随机改变的答案
Array[i][j] = 0;
到
Array[i][j] = 123;
得到了
Valuearray[0][0]: 0
Valuearray[0][1]: 0
Valuearray[0][2]: 0
Valuearray[0][3]: 0
Valuearray[0][4]: 0
Valuearray[0][5]: 0
Valuearray[0][6]: 0
Valuearray[0][7]: 0
Valuearray[0][8]: 0
Valuearray[0][9]: 0
Valuearray[0][10]: 0
Valuearray[0][11]: 0
Valuearray[0][12]: 0
Valuearray[0][13]: 0
Valuearray[0][14]: 65
Valuearray[0][15]: 0
Valuearray[0][16]: 123
[...]
其余的包含123.所以前面的16个元素不会被for循环改变。
我的程序代码:
//#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int global_file_count = 10;
const int global_max_x_coord = 309;
const int global_min_x_coord = 111;
int** make_array(int SizeY, int SizeX){ // SizeY=global_file_count+1,
// SizeX=global_max_x_coord-global_min_x_coord
//http://pleasemakeanote.blogspot.de/2008/06/2d-arrays-in-c-using-malloc.html
int** Array;
Array = (int**) malloc((SizeX)*sizeof(int*));
for (int i = 0; i < SizeX; i++) {
Array[i] = (int*) malloc((SizeY)*sizeof(int));
}
for (int i=1;i<=SizeY;i++){ // should fill everything element with 0 (????)
for(int j=0;j<=SizeX;j++){
Array[i][j] = 123;
}
}
return Array;
free(Array);
}
int main(){
int** Valuearray = make_array(global_file_count+1, (global_max_x_coord-global_min_x_coord));
for (int i=0;i<=global_file_count+1;i++){
for(int j=0;j<=(global_max_x_coord-global_min_x_coord);j++){
printf("Valuearray[%i][%i]: %i\n", i, j, Valuearray[i][j]);
}
}
free(Valuearray);
}
另外,当我额外种植
时Array[0][14] = 0;
之前
return Array;
在我的make_array() - 函数中,一切都很好,值得更改。但我真的宁愿让我的for-loop这样做......
我的问题是:由于这是不可复制的,我该怎么办呢?这是什么原因? 我使用Ubuntu 12.10。,Sublime Text 2作为IDE,gcc(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2作为编译器,如果此信息有用。 在此先感谢并抱歉这一大堆文字。
答案 0 :(得分:2)
试试这个
for (int i=0;i<SizeX;i++){ // should fill everything element with 0 (????)
for(int j=0;j<SizeY;j++){
Array[i][j] = 0;
}
}
或将malloc()
替换为calloc()
而不是上述for循环。
答案 1 :(得分:1)
您在填写数组时交换了SizeX
和SizeY
,这是正确的:
for ( i=0;i<SizeX;i++){ // should fill everything element with 0 (????)
for( j=0;j<SizeY;j++){
此外,您在循环中索引的次数太多,例如:
for (int i=1;i<=SizeY;i++)
^^^^^^^^
应该是:
for (int i=1;i<SizeY;i++)
所以你走出界限是未定义的行为。另外,这个previous thread关于自由二维阵列。
答案 2 :(得分:1)
填充数组时,您需要交换使用SizeX
和SizeY
,因为SizeX
是第一个索引的范围,而SizeY
是第二
此外,您需要开始在0
建立索引,并在size - 1
结束(无论size
是什么)。
所以:
for (int i = 0; i < SizeX; i++) {
for (int j = 0; j < SizeY; j++) {
Array[i][j] = 123;
}
}
(请注意,您还必须修复打印数组内容的循环中的索引)