[英]Dynamically Allocating Multidimensional Arrays
當我嘗試運行該程序時,我遇到了執行問題,它只是簡單地動態分配具有所選值的多維數組,並將其設置為零。 它可以正確編譯,但無法執行。
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int **tab;
int ligne;
int col;
printf("saisir le nbre de lignes volous\n");
scanf("%d", &ligne);
printf("saisir le nbre de colonnes volous\n");
scanf("%d", &col);
tab = (int**)malloc(ligne*sizeof(int*));
int i ,j;
for (i=0 ; i < ligne; i++) {
*(tab+i) = (int*)malloc(col*sizeof(int));
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
**(tab + i+ j) = 0;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", **(tab + i +j));
}
printf("\n");
}
free(tab);
return 0;
}
謝謝。
使用簡單的[row][col]
訪問雙指針。 它更具可讀性,並且可以避免編碼時出現錯誤。
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int **tab;
int ligne;
int col;
printf("saisir le nbre de lignes volous\n");
scanf("%d", &ligne);
printf("saisir le nbre de colonnes volous\n");
scanf("%d", &col);
tab = malloc(ligne*sizeof(int*));
if (tab != NULL)
{
int i ,j;
for (i=0 ; i < ligne; i++)
{
tab[i] = malloc(col*sizeof(int));
if (tab[i] == NULL)
{
fprintf(stderr, "Malloc failed\n");
return 1;
}
}
int k=0;
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
tab[i][j] = k++;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", tab[i][j]);
}
free(tab[i]);
printf("\n");
}
}
free(tab);
return 0;
}
int main(void) {
int ligne;
int col;
printf("saisir le nbre de lignes volous\n");
scanf("%d", &ligne);
printf("saisir le nbre de colonnes volous\n");
scanf("%d", &col);
int tableSize = ligne * (col*sizeof(int));
int * table = (int*) malloc(tableSize);
int i,j;
for (i=0 ; i < ligne; i++) {
for (j = 0; j < col; j++) {
*(table + i+ j) = 0;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", *(table + i +j));
}
printf("\n");
}
free(table);
return 0;
}
在這里,我做了一些更改,並對更改添加了一些評論
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int **tab = NULL;
int ligne = 0;
int col = 0;
char buffer[128] = {0};
printf("saisir le nbre de lignes volous\n");
// to avoid leaving \n in buffer after you enter the first value
// you should also check also return value of fgets
// and quit program if it returns NULL
// in general it is good practice to check return values
// of all run-time functions.
if (fgets(buffer,sizeof(buffer),stdin)==NULL) {
return 1;
}
ligne = atoi(buffer);
printf("saisir le nbre de colonnes volous\n");
if (fgets(buffer,sizeof(buffer),stdin) == NULL) {
return 1;
}
col = atoi(buffer);
tab = malloc(ligne*sizeof(int*)); // do not cast malloc
int i ,j;
// use tab[i] and tab[i][j] syntax, it is easier to read
for (i=0 ; i < ligne; i++) {
tab[i] = malloc(col*sizeof(int));
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
tab[i][j] = 0;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", tab[i][j]);
}
printf("\n");
}
// before you free tab, you need to free all lines
for (i=0 ; i < ligne; i++) {
free(tab[i]);
}
free(tab);
return 0;
}
分配數組后,(一維部分)數組可以被稱為table[i][j]
,而不是像
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
**(tab + i+ j) = 0; /* <--- this is an error */
}
}
如您所見, tab + i + j
是一個指針,您將i
( ligne
數)加j
( col
數)偏移了,而它們實際上並沒有相同的大小(列是一個單元格大小,行是一個行大小)您最好編寫tab[i][j]
因為tab[i]
是一個指針(分配給malloc(3)
),它指向一個一維數組(以及不同的指針tab[0]
, tab[1]
,... tab[n]
不必相互關聯,因為它們來自不同的malloc()
調用)如果您不喜歡方括號符號,則應編寫等效的
*(*(mat + i) + j) /* equivalent to mat[i][j] */
永遠不要在代碼中使用符號。
**(tab + i + j) /* equivalent to *mat[i + j] */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.