C 指针指向指针不准确

C 指针指向指针不准确,c,arrays,pointers,C,Arrays,Pointers,我使用2D数组,并尝试将它从一个函数传递到另一个函数。我在这里看到了所有关于这个问题的答案,但似乎没有一个能回答这类问题。这是我试图实现的一件简单的事情,但答案很奇怪 这是主要的() 我没有以任何方式修改第一个数组,只是再次打印了它,你知道为什么这两个数组不同吗?在你的makearray中,malloc使用sizeof(int),但是你正在为double创建一个数组。int通常使用4字节,但doubles使用8字节。因此,您没有为二维双精度阵列占用足够的内存。尝试: double** makea

我使用2D数组,并尝试将它从一个函数传递到另一个函数。我在这里看到了所有关于这个问题的答案,但似乎没有一个能回答这类问题。这是我试图实现的一件简单的事情,但答案很奇怪

这是主要的()


我没有以任何方式修改第一个数组,只是再次打印了它,你知道为什么这两个数组不同吗?

在你的makearray中,
malloc
使用
sizeof(int)
,但是你正在为
double
创建一个数组。int通常使用
4字节
,但
double
s使用
8字节
。因此,您没有为二维双精度阵列占用足够的内存。

尝试:

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;

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

a=malloc(n2*sizeof(double*);//当你
退出(0)
你不
释放
数组时,操作系统可能会,但我认为这样做不是一个好的做法。
sizeof(int*)
sizeof(int)
makearray
int
-->
double
我注意到你从来没有调用过
free
,你应该这样做。而且,当你遇到这种问题时,你应该使用调试器,这会为你节省很多问题。关于调试器的类型有什么建议吗?这取决于你使用的操作系统,但对我来说是Linux,立即帮助我发现了问题,甚至没有看代码。除了我在这方面看起来非常笨拙之外,上面的(错误)输出是否意味着指针正在自我缠绕?关于它如何确定最后三列上的值0、1、2,有什么想法吗?因为您需要9个双精度行(9*8=72字节),但最终得到的行数为9整数(9*4=36字节),当您指定9个双精度时,您将把索引为ed的行写入下一行内存。然后,当该行指定其值时,它将重写第一行的最后一个值。这将持续到最后一行,该行没有被覆盖,但它写入的内存没有被分配,并且可能在某个时候被用户使用我完全忽略了这一点,为难以置信的快速反应干杯!
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;

}
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 
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;

}