【问题标题】:three dimensional character array in CC中的三维字符数组
【发布时间】:2011-02-14 05:31:52
【问题描述】:

我想声明一个字符串的三维数组 其中每一行有两个字符串。

在这里我可以声明它:

char *szArray[][2] = {
    {"string1", "string2"},
    {"string3", "string4"},
    {"string5", "string6"},
    {0, 0}
};

我想做同样的事情,但行数是动态分配的。

在这里您可以假设第一个维度是动态决定的。 第 2 维是 2, 第三维是 25。

尝试了很多方法都没有运气:(。

提前致谢!

【问题讨论】:

  • 到目前为止,您尝试了什么样的代码来使动态分配起作用?
  • C 和 C++ 不是同一种语言。
  • 您已通过编辑 改变了问题的整个基调。我以为他想要一个非此即彼的解决方案。
  • char * szIPList[2][25] ; szIPList[0] = 新字符[2][25]; vs 2005 编译器错误:'=':无法从 'char (*)[25]' 转换为 'char *[25]' 抱歉 Jefromi,我正在尝试使用 vs 2005 C++ 编译器,它是 cpp 程序。
  • [code] //@Thanks michael 我找到了我猜的方式。整数 n =5 ; char *** szData = (char *** )malloc(n * sizeof(char ** )) ; for(int i = 0 ; i

标签: c arrays multidimensional-array


【解决方案1】:

首先,您的问题不是char 的3 维数组,而是指向char 的指针的2 维数组。在 C 中,指针和数组不是一回事。

要回答您的问题,现代 C 语言 C99 中最简单的方法是使用可变长度数组 VLA 来实现您的目的。对于 3 维数组,您会这样做

char szData[x][y][z];

其中xyz 是变量或表达式,它们仅在您点击该声明时在运行时确定。

VLA 的不便之处在于您必须小心它们不会变得对您的堆栈来说太大,并且您必须通过分配给各个条目来初始化它们(这里是嵌套的 for-loop) .

继续您的二维字符串数组示例

char* szData[x][y];

然后您必须将单独的字符串分配给每个指针或将它们设置为0

for (size_t i = 0; i < x; ++i)
   for (size_t j = 0; j < y; ++j)
     szData[i][j] = 0;

【讨论】:

    【解决方案2】:
    int n = 0 ;
    
    printf("Enter the number of rows\n");
    
    scanf("%d",&n);
    
    char *** szData = (char *** )malloc(n * sizeof(char ** )) ;
    
    //Allocate memroy for each row
    
    for(int i = 0 ; i < n ; i++ )
    { 
        szData[i] = (char ** ) malloc(2 * sizeof(char * )) ;
        for ( int j = 0 ; j < 2 ; j++ )
        { 
            szData[i][j] = (char *) malloc (25 * sizeof(char));
        }
     }
    
     //Assign some data
    
     for( int i = 0 ; i < n ; i++ )
     { 
        sprintf(szData[i][0],"string%d", i); 
        sprintf(szData[i][1],"string1%d", i);
     }
    
     //print all the elements
    
     for( int i = 0 ; i < n ; i++ ) 
     { 
        printf("%s\n",szData[i][0]);
        printf("%s\n",szData[i][1]);
     } 
    
     //free memory here
     for(int i = 0 ; i < n ; i++ )
     {  
        for ( int j = 0 ; j < 2 ; j++ )
        { 
            delete szData[i][j];
        } 
     }
    
     for(int i = 0 ; i < n ; i++ )
     {  
        delete szData[i];
     }
    
     delete szData;
    

    【讨论】:

      【解决方案3】:

      我没有收到任何错误:

      #include <stdio.h>
      
      int main(){
      char *szArray[][2] = { {"string1", "string2"}, {"string3", "string4"}, {"string5", "string6"}, {0, 0} };
      
       printf("%s\n", szArray[0][0]);
       printf("%s\n", szArray[2][0]);
      
      }
      

      这是输出:

      $ gcc test.c
      $ ./a.exe
      string1
      string5
      

      但是你不能打印 szArray[3][0][0] 因为它是 0,如果你想将值初始化为任何值,你可以设置为 "\0" 而不是仅仅 0

      【讨论】:

        【解决方案4】:

        好的,这里没有编译器可以仔细检查,但您可以通过多种方式进行检查。最直接的方法是声明一个 char[25][3] 的 Vector 并让 c++ 为您完成。像 Vector foo 然后只是 push_back 你的动态元素。但是,如果没有编译器,我不能 100% 确定这会起作用,因为在涉及多维数组时有一些时髦的规则。你总是可以将你的数组作为第一遍去维度化,只是为了让它也能正常工作——就像一个向量,然后开始添加你想要的任何东西。您还可以使用 char 方法的向量向量,并使用锯齿状的 char 数组,其中 3 维可以是动态的,这甚至可能更节省内存。这里有很多选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多