c-初始化一个具有零的2d数组;打印其值表明,并非每个元素都包含0



我已经在这里搜索了答案,但找不到适合我的答案。

我有一个函数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]: %in", i, j, Valuearray[i][j]);
        }
    }
    free(Valuearray);
}

此外,当我种植额外的时

Array[0][14] = 0;

之前

return Array;

在我的makearray((函数中,一切都很好,值也会发生变化。但我真的宁愿让我的for循环来做这件事。。。

我的问题是:由于它是不可复制的,我该怎么办?这是什么原因?如果这些信息有用的话,我使用的是Ubuntu 12.10.,Sublime Text 2作为IDE,gcc(Ubuntu/Linaro 4.7.2-2ubuntu1(4.7.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;
    }
}

或者将CCD_ 1替换为CCD_。

填充数组时,需要围绕SizeXSizeY的使用进行交换,因为SizeX是第一个索引的范围,SizeY是第二个索引的区域。

此外,您需要从0开始索引,并在size - 1结束(无论size是什么(。

因此:

for (int i = 0; i < SizeX; i++) {
    for (int j = 0; j < SizeY; j++) {
        Array[i][j] = 123;
    }
}

(注意,您还必须修复打印数组内容的循环中的索引(

您在填充数组时交换了malloc()0和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++)

所以你正在越界,这是未定义的行为。此外,这是之前关于自由2D阵列的线程。

相关内容

  • 没有找到相关文章

最新更新