【问题标题】:'jpg_name' may be used uninitialized in this function [-Werror=uninitialized]'jpg_name' 可能在此函数中使用未初始化 [-Werror=uninitialized]
【发布时间】:2012-07-23 18:55:35
【问题描述】:
int counter = 0;
char *jpg_name;
sprintf(jpg_name, "%3i.jpg", counter);
FILE *photo = fopen( jpg_name, "w");
counter++;

我不断收到以下错误:

'jpg_name' may be used uninitialized in this function [-Werror=uninitialized]

我正在尝试使用sprintf 函数写入文件名。我想我一定是以不正确的方式声明了char*,但我不确定如何正确地做到这一点。

【问题讨论】:

    标签: c pointers char


    【解决方案1】:

    抱怨是因为您使用的是未初始化的指针,而不是因为内容。尝试malloc一些内存。

    char *jpg_name = malloc(ENOUGH);
    

    您也可以只使用char 数组。


    旁注:您可以考虑使用snprintf 而不是sprintf

    【讨论】:

    • 好的。这是一个数组,如果我需要三个字符,我应该为三个字节分配足够的内存,以及为字符“jpg_name”分配足够的字节? (任何数组的第一个槽都被数组的名字占用了,对吧?)
    • @newbie_hannah 只计算符号的数量 :-)
    • 您需要为要添加的所有字符分配足够的空间,并为空终止字符分配 1 个额外的插槽。数组名没有使用槽,变量名只是指向你分配的内存。
    • 所以在这种情况下 4 个字节应该可以做到。感谢您的帮助!
    • @newbie_hannah 不,你可能需要更多。
    【解决方案2】:

    您需要为正在构建的字符串分配内存。

    char jpg_name[MAX_LEN + 1];
    snprintf(s, MAX_LEN, "%3i.jpg", counter);
    

    你也可以使用malloc:

    jpg_name = malloc(sizeof(char) * (MAX_LEN + 1));
    

    在您的情况下,MAX_LEN 应该至少为 5,假设您只有一位数的计数器。如果您的计数器可以增长到多位数,则需要使用更大的MAX_LEN 来说明这一点。

    至于您的错误:当您使用尚未初始化的变量时,编译器会警告您:设置为某个值。你没有初始化你的 char* 所以编译器会抱怨,但这也可能发生,例如带有未初始化的int。养成将变量初始化为默认值的习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多