问题就是你的编译器告诉你的那样:你不能初始化可变长度数组。Zack在评论中给出了一个明显的解决方案:删除初始化。在这个答案中,你会找到一些具有初始值的工作示例以及一些不允许初始值的示例。关于此更多信息请参阅评论。以下示例按最明智(依我之见)到最不明智(涉及使用malloc
)的顺序排列,用于为表示数字的十进制位数分配存储空间。
我建议使用与确定将int
值存储为八进制所使用的相同技巧来确定存储其十进制位数所需的字节数:将int
中的总位数除以3并添加任何符号和NUL终止符。 digit_count
可以像这样编写一个预处理器宏:
#include <limits.h>
#include <stddef.h>
#include <stdio.h>
#define digit_count(num) (1 \
+ sizeof (num) * CHAR_BIT / 3 \
+ (sizeof (num) * CHAR_BIT % 3 > 0) \
+ 1)
int main(void) {
short short_number = -32767;
int int_number = 32767;
char short_buffer[digit_count(short_number)] = { 0 };
char int_buffer[digit_count(int_number)];
sprintf(short_buffer, "%d", short_number);
sprintf(int_buffer, "%d", int_number);
}
正如你所看到的,一个强大的好处是可以在不修改代码的情况下将 digit_count
用于任何类型的整数: char
、short
、int
、long
、long long
和相应的 unsigned
类型。
与此相比的一个小缺点是你会浪费一些存储空间,特别是对于像 1
这样的小值。在许多情况下,这种解决方案的简单性远远弥补了这一点;在运行时计算十进制数字所需的代码将占用比此处浪费的空间更多的内存。
如果你准备放弃上面代码的简单性和通用性,并且真的想要计算十进制数字的数量,Zacks 的建议就适用:移除初始化。下面是一个例子:
#include <stddef.h>
#include <stdio.h>
size_t digit_count(int num) {
return snprintf(NULL, 0, "%d", num) + 1;
}
int main(void) {
int number = 32767;
char buffer[digit_count(number)];
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);
。
翻译:...在你完成使用之后,不要忘记调用
free(buffer);
。
= ""
гЂ‚snprintf
дёҚењЁд№Һе…¶иң“е‡ғзә“е†ІеЊғе…€е‰Қжњ‰д»Ђд№€е†…е®№гЂ‚ - zwolgcc prog.c -std=c99
或者替换新版本的gcc。 - BLUEPIXYchar fileSizeStr[5] = "";
或使用 malloc 可以生效。 - anairinac