使用数字作为大小创建整数的char数组

我试图在C中创建一个char数组,用int的数字填充它,但int可以是任意数量的数字。

我正在使用一个名为getDigits(int num)的创建函数,它返回int所具有的位数。

 char buffer[getDigits(number)] = ""; snprintf(buffer, sizeof(buffer),"%d",number); 

但是当我使用gcc编译时,它返回:

error: variable-sized object may not be initialized

我已经尝试了一切。 当我将其声明为char fileSizeStr[5] = ""; , 有用。 当我尝试动态声明缓冲区大小时,我可以看到问题正在上升,但我真的想知道是否是实现此目的的一种方法。

问题正如您的编译器告诉您的那样; 您不能初始化VLA。 Zack在评论中给出了明显的解决方案:删除初始化。 你会在这个答案中找到工作的例子,其中一些确实允许初始化,而另一些则不允许。 您可以在评论中找到有关该信息的更多信息。 以下示例从最敏感(IMHO)到最不敏感(涉及使用malloc )排序,用于为表示数字的十进制数字序列分配存储。


我建议使用相同的技巧来确定将int值存储为十进制数字需要多少字节,就像用于八进制一样:将int的总位数除以3并添加任何符号和NUL终止。 digit_count可以写成预处理器宏,如下所示:

 #include  #include  #include  #define digit_count(num) (1 /* sign */ \ + sizeof (num) * CHAR_BIT / 3 /* digits */ \ + (sizeof (num) * CHAR_BIT % 3 > 0)/* remaining digit */ \ + 1) /* NUL terminator */ int main(void) { short short_number = -32767; int int_number = 32767; char short_buffer[digit_count(short_number)] = { 0 }; /* initialisation permitted here */ char int_buffer[digit_count(int_number)]; sprintf(short_buffer, "%d", short_number); sprintf(int_buffer, "%d", int_number); } 

正如您所看到的,这里的一个强大好处是digit_count可用于任何类型的整数而无需修改: charshortintlonglong long和相应的unsigned类型。

相比之下,一个小的缺点就是浪费了几个字节的存储空间,特别是对于像1这样的小值。 在许多情况下,这种解决方案的简单性弥补了这一点; 在运行时计算十进制数字所需的代码将占用更多的内存空间,而不是浪费在这里。


如果您准备抛弃上述代码的简单性和通用性,并且您真的想要计算小数位数,则应用Zacks建议:删除初始化。 这是一个例子:

 #include  #include  size_t digit_count(int num) { return snprintf(NULL, 0, "%d", num) + 1; } int main(void) { int number = 32767; char buffer[digit_count(number)]; /* Erroneous initialisation removed as per Zacks advice */ sprintf(buffer, "%d", number); } 

回应malloc建议:解决这个问题的最不可靠的方法是避免不必要的代码(例如,调用malloc以及稍后free )。 如果您不必从函数返回对象,则不要使用malloc ! 否则,考虑存储到调用者提供的缓冲区中(通过参数),以便调用者可以选择使用哪种类型的存储。 这不是使用malloc的合适替代方案。

但是,如果您决定使用malloc并为此free ,请以最不可怕的方式进行。 避免对malloc的返回值进行类型转换,并通过sizeof (char) (总是为1)进行乘法运算。 以下代码是一个示例。 使用上述任一方法计算长度:

 char *buffer = malloc(digit_count(number)); /* Initialisation of malloc bytes not possible */ sprintf(buffer, "%d", number); 

…而且不要忘记free(buffer); 当你完成它。

尝试类似的东西:

  char* buffer =(char *)malloc(getDigits(number)*sizeof(char)); 

malloc和calloc用于dinamic分配。

以下可能有所帮助

 char* buffer; buffer = (char*)malloc(number * sizeof(char)); 

对于我的钱,有一个解决方案没有提及但实际上比上述任何一个都简单。 在Linux和大多数BSD变体上都有一个名为“asprintf”的sprintf组合分配版本。 它确定必要的大小,mallocs内存,并将填充的字符串返回到第一个参数。

 char * a; asprintf(&a, "%d", 132); // use a free(a); 

使用堆栈分配的数组肯定不需要空闲,但这完全不需要单独计算大小。

您需要使用malloc来分配动态内存量。

只有在编译时知道大小时,才允许初始化您的方法。