指向指针不准确的指针

时间:2014-12-27 23:07:09

标签: c arrays pointers

我正在使用2D数组,并尝试将其从一个函数传递到另一个函数。我已经在这里看到了所有的答案,但他们似乎都没有回答这种特殊类型的问题。这是我想要实现的一件简单的事情,但答案很奇怪。

这是main():

int main(void)
{   
 int i=0,j=0,n=0,n2=0;    
 double **a, **a1, b=0; 

 printf("Enter 'n2' :");
 scanf("%d", &n2);


 a= makearray(n2);
 for(i=0; i < n2; i++){
     for(j=0; j < n2; j++){         
         a[i][j] = j;
         printf("%.f ",a[i][j]);
    }
     printf("\n");
  }

 printf("\n\n\n");

 for(i=0; i < n2; i++){ // print a
      for(j=0; j < n2; j++){
         b = a[i][j];
         printf("%.f ", b);
     }
     printf("\n");
 }

 printf("\n\n\n");
 return 0;
}  

函数 makearray()只返回指向作为参数传递的大小的2D数组的指针的指针。

makearray()是:

double** makearray(int n2)
{
int i=0;
double** a;

a = malloc(n2 * sizeof(int *));
if(a == NULL){
    fprintf(stderr, "out of memory\n");
    exit(0);
    }

for(i = 0; i < n2; i++){
    a[i] = malloc(n2 * sizeof(int));
    if(a[i] == NULL){
        fprintf(stderr, "out of memory\n");
        exit(0);
        }
    }

return a;

}

您可以输入'n2',其中(n2 x n2)成为矩阵大小,n = 9,输出为:

0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 

0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 0 1 2
0 1 2 3 4 5 6 7 8 

我没有以任何方式修改过第一个数组,只是再次打印出来,为什么这两个数据有什么不同?

2 个答案:

答案 0 :(得分:3)

在您的阵型中,malloc正在使用sizeof(int),但您正在为double创建数组。 Ints通常使用4 bytes,但double使用8 bytes。所以你不是malloc - 为2-d的双打数组留下足够的内存。

答案 1 :(得分:3)

尝试:

double** makearray(int n2)
{
int i=0;
double** a;

a = malloc(n2 * sizeof(double *)); //<- was sizeof(int *)
if(a == NULL){
    fprintf(stderr, "out of memory\n");
    exit(0);
    }

for(i = 0; i < n2; i++){
    a[i] = malloc(n2 * sizeof(double)); //<- was sizeof(int)
    if(a[i] == NULL){
        fprintf(stderr, "out of memory\n");
        exit(0);
        }
    }

return a;

}