【问题标题】:Dynamically Allocating Multidimensional Arrays动态分配多维数组
【发布时间】:2017-03-18 13:46:30
【问题描述】:

当我试图运行这个程序时,我遇到了执行问题,它只是动态地分配一个具有选定值的多维数组并将其归零。它编译正确,但没有执行。

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

谢谢。

【问题讨论】:

  • 是的,实际上是:) 谢谢
  • 使用fgets从键盘读取,然后sscanf读取值或直接使用atoi进行转换。
  • **(tab+i+j) 是访问元素的错误方式。你可以使用tab[i][j]
  • 它不执行是什么意思?

标签: c arrays multidimensional-array dynamic-allocation


【解决方案1】:

使用简单的[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;
}

【讨论】:

    【解决方案2】:
    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;
    }
    

    【讨论】:

      【解决方案3】:

      在这里,我做了一些更改,并在更改中添加了一些 cmets

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

      【讨论】:

        【解决方案4】:

        当你分配了你的数组,(一维部分)你的数组可以被寻址为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],@987654332 @,... tab[n] 不必相互关联,因为它们来自不同的 malloc() 调用)如果你不喜欢括号符号,那么你应该写等效

        *(*(mat + i) + j)  /* equivalent to mat[i][j] */
        

        绝不是您在代码中使用的符号。

        **(tab + i + j)  /* equivalent to *mat[i + j] */
        

        【讨论】:

          猜你喜欢
          • 2020-04-24
          • 2011-05-31
          • 2013-04-02
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-03
          相关资源
          最近更新 更多