簡體   English   中英

如何使用指針消除二維數組聲明中的錯誤?

[英]How to remove error in 2-d array declaration using pointers?

如果我將二維數組聲明為

#include <stdio.h>
#include <stdlib.h>
int main() { int c=5;int r=6;
    int **a=(int **) malloc (c*sizeof(int *));
    int i,j;
    for (i=0;i<c;i++){
        *(a+i)=(int *) malloc (r*sizeof (int));
    }
}

上述程序成功運行。

#include <stdio.h>
#include <stdlib.h>
int main() { int c=5;int r=6;
    int **a;
     **a=(int **) malloc (c*sizeof (int *));
    int i,j;
    for (i=0;i<c;i++){
        *(a+i)=(int *) malloc (r*sizeof (int));
    }
}

但是編譯器在上述程序中顯示錯誤。

為什么這樣? 任何幫助將不勝感激。

您聲明了一個未初始化且具有不確定值的int **類型的指針。

int **a;

然后在下一條語句中,您將取消引用指針兩次

 **a=(int **) malloc (c*sizeof (int *));

表達式**a具有int類型,而右側表達式具有int **類型。

因此編譯器發出一條消息,指出操作數具有不同的類型。

此外,如果將運行這樣的程序,則取消引用未初始化的指針會導致未定義的行為。

你至少應該寫

 a=(int **) malloc (c*sizeof (int *));

請注意,如果在第一個程序中,變量r表示行,變量c表示列,那么您應該按行分配 arrays,程序應該看起來像

#include <stdio.h>
#include <stdlib.h>
int main() { int c=5;int r=6;
    int **a=(int **) malloc (r*sizeof(int *));
    int i;
    for (i=0;i<r;i++){
        *(a+i)=(int *) malloc (c*sizeof (int));
    }
}

否則,表達式a[i]將產生一列而不是一行。

如上所示分配 arrays 后,表達式**a等效於表達式a[0][0]並將產生存儲在第一行第一列中的int類型的 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM