【问题标题】:dynamic memory for 2D char array二维字符数组的动态内存
【发布时间】:2011-02-06 12:57:58
【问题描述】:

我已经声明了一个数组 字符 **arr; 如何初始化二维字符数组的内存。

【问题讨论】:

标签: c memory-management


【解决方案1】:

一种方法是执行以下操作:

char **arr = (char**) calloc(num_elements, sizeof(char*));

for ( i = 0; i < num_elements; i++ )
{
    arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}

这里发生了什么相当清楚 - 首先,您正在初始化一个指针数组,然后为该数组中的每个指针分配一个字符数组。

您可以将其包装在一个函数中。使用后,您还需要 free() 它们,如下所示:

for ( i = 0; i < num_elements; i++ )
{
    free(arr[i]);
}

free(arr);

我认为这是做事最简单的方法,并且符合您的需要。

【讨论】:

  • 我会使用“arr”而不是“char”作为第一个 calloc。循环中的 calloc 使用 "**arr" 而不是 "c​​har"。
  • 通过多次分配,内存不会连续。在增加指针以访问该值时它会正常工作吗?
  • @Ankur 仅在二维数组的
  • @Andrei 我也可以,(@Ankur - 这是为了保证你不会混淆类型)但我认为我在这里所做的解释更清楚。
【解决方案2】:

分配char **类型的数组有两种选择

我从comp.lang.c FAQ 抄录了这两个代码示例(其中还包含这两种数组类型的一个很好的说明)

选项 1 - 每行分配一次,并为行指针分配一次。

char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
for(i = 0; i < nrows; i++)
  array1[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately

选项 2 - 将所有元素一起分配并分配行指针:

char **array2 = malloc(nrows * sizeof(char *));      // Allocate the row pointers
array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
for(i = 1; i < nrows; i++)
  array2[i] = array2[0] + i * ncolumns;

您也可以只分配一个内存块并使用一些算术来获取元素[i,j]。但是你会使用char* 而不是char** 并且代码变得复杂。例如arr[3*ncolumns + 2] 而不是 arr[3][2]

【讨论】:

    【解决方案3】:

    使用一维数组可能会更好:

    char *arr = calloc(WIDTH*HEIGHT, sizeof(arr[0]));
    
    for (int y=0; y<HEIGHT; y++)
        for (int x=0; x<WIDTH; x++)
            arr[WIDTH*y+x] = 2*arr[WIDTH*y+x];
    
    free(arr);
    

    【讨论】:

      【解决方案4】:

      使用以下技巧:

      typedef char char2D[1][1];
      
      char2D  *ptr;
      
      ptr = malloc(rows * columns, sizeof(char));
      
      for(i = 0; i < rows; i++)
          for(j = 0; j < columns; j++)
              (*ptr)[i][j] = char_value;
      

      【讨论】:

        【解决方案5】:
        char **array;
        int row,column;
        char temp='A';
        printf("enter the row");
        scanf("%d",&row);
        printf("enter the column");
        scanf("%d",&column);
        array=(char **)malloc(row*sizeof(char *));
        for (int i=0;i<row;i++)
        {
            array[i]=(char*)malloc(column*sizeof(char));
        }
        

        【讨论】:

          【解决方案6】:

          对于二维字符数组,如果你的意思是一个字符串矩阵,那么它可以通过以下方式完成。

          int nChars = 25; // assuming a max length of 25 chars per string
          int nRows = 4;
          int nCols = 6;
          char *** arr = malloc(nRows * sizeof(char **));
          int i;
          int j;
          for(i = 0; i < nCols; ++i)
          {
              arr[i] = malloc(nCols * sizeof(char *));
          }
          for(i = 0; i < nRows; ++i)
          {
              for(j = 0; j < nCols; ++j)
              {
                  arr[i][j] = malloc(nChars * sizeof(char));
                  sprintf(arr[i][j], "Row %d Col %d", i, j);
              }
          }
          

          打印二维字符数组(字符串矩阵(字符数组))

          for(i = 0; i < nRows; ++i)
          {
              for(j = 0; j < nCols; ++j)
              {
                  printf("%s  ", arr[i][j]);
              }
              printf("\n");
          }
          

          结果是

          Row 0 Col 0    Row 0 Col 1    Row 0 Col 2    Row 0 Col 3    Row 0 Col 4    Row 0 Col 5  
          Row 1 Col 0    Row 1 Col 1    Row 1 Col 2    Row 1 Col 3    Row 1 Col 4    Row 1 Col 5  
          Row 2 Col 0    Row 2 Col 1    Row 2 Col 2    Row 2 Col 3    Row 2 Col 4    Row 2 Col 5  
          Row 3 Col 0    Row 3 Col 1    Row 3 Col 2    Row 3 Col 3    Row 3 Col 4    Row 3 Col 5  
          

          【讨论】:

            猜你喜欢
            • 2021-10-08
            • 1970-01-01
            • 1970-01-01
            • 2020-07-11
            • 1970-01-01
            • 1970-01-01
            • 2014-07-19
            相关资源
            最近更新 更多