2012-07-23 109 views
3
int counter = 0; 
char *jpg_name; 
sprintf(jpg_name, "%3i.jpg", counter); 
FILE *photo = fopen(jpg_name, "w"); 
counter++; 

我不断收到以下错误:“jpg_name”可在此功能中使用未初始化[-Werror =未初始化]

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

我想写使用sprintf功能的文件名。我想我必须以某种不正确的方式宣布char*,但我不知道如何正确地做到这一点。

回答

2

这是抱怨,因为你正在使用未初始化的指针,而不是因为内容。尝试malloc一些记忆。可以使用char数组。


旁注:你可能会考虑snprintf而不是sprintf

+0

好的。这是一个数组,如果我需要三个字符,我应该malloc足够的内存三个字节,以及足够的字节为字符“jpg_name”? (任何数组中的第一个槽被数组的名称占用,对吧?) – hannah 2012-07-23 19:00:08

+0

@newbie_hannah只需要计算符号的数量:-) – cnicutar 2012-07-23 19:00:56

+1

您需要为所有要添加的字符分配足够的空间,以及1用于空终止符字符的附加插槽。没有插槽用于数组的名称,变量名称只是指向您分配的内存。 – pb2q 2012-07-23 19:01:02

0

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

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。养成将变量初始化为默认值的习惯。