簡體   English   中英

動態分配多維數組

[英]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是一個指針,您將iligne數)加jcol數)偏移了,而它們實際上並沒有相同的大小(列是一個單元格大小,行是一個行大小)您最好編寫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.

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