【问题标题】:How to create a variable size 2D string array by passing variable如何通过传递变量创建可变大小的二维字符串数组
【发布时间】:2019-06-12 13:39:32
【问题描述】:

谁能给我一个示例,如何通过传递数组长度的变量在 C 中创建 2D char 数组。

//Current program
int i;
int seq_cnt;    
exec sql    
        select count(0)     
        into seq_cnt     
        from    table;    
char tmp1[50][5+1];       
char tmp2[50][5+1];   

for(i=0;i < seq_cnt ; i++){   
     strcpy(tmp1[i],"something");    
     strcpy(tmp2[i],"something");    
}     

现在我想要的是tmp1tmp2 的数组大小,我想使用seq_cnt 来声明tmp1tmp2 的实际大小,而不是硬编码它(50)。

喜欢:

char tmp1[seq_cnt][5+1];     
char tmp2[seq_cnt][5+1];     

我是 C 新手。

【问题讨论】:

  • 如果您使用的是 C99+,char tmp1[seq_cnt][5+1]; char tmp2[seq_cnt][5+1]; 应该可以工作。或者您可以使用malloc 动态分配内存。注意:"something" 不适合大小为 5 + 1 的数组
  • @Spikatrix:取决于编译器。某些 VC 版本不支持 VLA。 C11 也使 VLA 成为可选的。 C++ 根本不知道它们。

标签: c string multidimensional-array dynamic


【解决方案1】:

我想用seq_cnt来声明tmp1的实际大小

char (*tmp1)[5+1] = malloc(seq_cnt * sizeof *tmp1);

更新 C 中星号 * 的三种不同用法。

  1. 类型/变量定义

    这里

    char (*tmp1)[5+1]
    

    星号用于定义一个指针,一个指向char[5+1]数组的指针。

    请注意括号是强制性的,因为char *tmp[5+1] 将定义一个指向char 的6 指针数组。

  2. 间接(或取消引用)运算符

    这里

    sizeof *tmp1
    

    星号用于告诉编译器不要采用tmp1 的大小,这将是指针的大小,而是采用tmp1 指向的大小,即char[5+1]

    也可以写成sizeof (char[5+1])。请注意括号不属于sizeof,因为它不是函数,而是运算符。

  3. 乘法运算符

    这里

    seq_cnt * sizeof ...
    

    星号用于表示普通乘法,即计算seq_cnt与某物大小的乘积。

所以总而言之,最上面的语句分配seg_cnt乘以char[5+1]需要的字节,并将分配给tmp1的块的第一个字节的地址分配给tmp1,使其指向足够的内存来保存seq_cnt char[5+1] 的数组。

【讨论】:

  • 非常感谢。这正是我想要的。你介意再解释一下吗?我不熟悉 malloc 。还有很多 * 让我感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2021-08-22
  • 2017-07-26
  • 2015-12-28
相关资源
最近更新 更多