全局变量的意外初始化
unexpected initialization of global variable
我的头文件为:
test.h
//Mandatory fields size macro
#define size_uid 65
#define size_txn 33
#define size_adhaarNo 13
#define size_ver 4
#define size_input 65
#define size_photo 1024*1024*10
#define size_pseudonym 50
#define size_name 50
//Mandatory fields declaration
char uid[size_uid];
char txn[size_txn];
char adhaarNo[size_adhaarNo];
char ver [size_ver];
char *photo;
char pseudonym[size_pseudonym];
char name[size_name];
char input[size_input];
void incorrect_val_test(FILE *, FILE *, FILE *, FILE *, FILE *, FILE *,FILE *,FILE *,FILE *,FILE*);
test.c
#include "test.h"
//Mandatory fields declaration
char uid[] = "865A80A01C70A9E0D5FC5F4D354A9155BF58CD483B1397C92614E5BC92317ACC";
char txn[] = "23da7b99-c561-4102-9df8-d37fbfe1";
char adhaarNo[] = "250241800087";
char ver [] = "1.0";
char *photo = (char *)malloc(sizeof(char)*size_photo);
char pseudonym[] = "2b6c55566d14459991513fb00bce34ed";
char name[] = "Amarjeet Sharma";
char input[] = "936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af";
void incorrect_val_test(FILE *ver, FILE *ts, FILE *txn, FILE *vtxn, FILE *uid, FILE *input, FILE *adhaarNo, FILE *photo, FILE *name, FILE *pseudonym)
{
//Some initialization and files are opened here....
photo = (char *)malloc(sizeof(char)*size_photo);
FILE *photos = fopen("./input/data.txt","r");
if(photos == NULL)
{
printf("Can't open data file.\n");
return;
}
i=0;
while((read_char = fgetc(photos))!= EOF)
{
if(read_char == '\n')
continue;
photo[i]= read_char;
i++;
}
// Some more processing done here
}
main.c
int main()
{
// Some files are opened here to read data.
incorrect_val_test(fp_ver, fp_ts, fp_txn, fp_vtxn, fp_uid, fp_input, fp_adhaarNo, fp_photo, fp_name, fp_pseudonym);
return 0;
}
当我编译时,它给出了以下错误信息
错误信息
warning: assignment from incompatible pointer type
[-Wincompatible-pointer-types]
photo = (char
*)malloc(sizeof(char)*size_photo);
error: incompatible types when assigning to type ‘FILE {aka struct _IO_FILE}’ from type ‘char’
photo[i]= read_char;
谁能指出我哪里出错了?
你可以像这样调用一个函数
char *photo = (char *)malloc(sizeof(char)*size_photo);
在 函数中 。这在 global 范围内是不允许的。删除 global 一个,保留 incorrect_val_test()
函数中的那个。
此外,请do not castmalloc()
和家人C
的return值。
解决方案:
- 在全局范围内定义
char *photo = NULL;
。
正如你所做的那样,在你的incorrect_val_test()
中为photo
分配内存,比如
char *photo = malloc(size_photo); //cast not required
// sizeof(char) is guranteed to be 1
那么,你在函数参数列表incorrect_val_test()
函数中得到了FILE *photo
void incorrect_val_test(..., FILE *photo, ...)
影响全局 [=23=]。
恕我直言,你要的是写
void incorrect_val_test(..., FILE *photos, ...)
^
|
并且,在函数体内,
photos = fopen("./input/data.txt","r");
但是,那么,为什么要使用具有 单个字符差异 的变量名称?使用更详细且易于区分的内容。
注意:使用完photo
后,不要忘记free()
分配的内存以避免内存泄漏。
你有这个功能
void incorrect_val_test(..., FILE *photo, ...)
请注意,您有一个参数 shadows 全局变量。这就是你问题错误的原因。
我的头文件为:
test.h
//Mandatory fields size macro
#define size_uid 65
#define size_txn 33
#define size_adhaarNo 13
#define size_ver 4
#define size_input 65
#define size_photo 1024*1024*10
#define size_pseudonym 50
#define size_name 50
//Mandatory fields declaration
char uid[size_uid];
char txn[size_txn];
char adhaarNo[size_adhaarNo];
char ver [size_ver];
char *photo;
char pseudonym[size_pseudonym];
char name[size_name];
char input[size_input];
void incorrect_val_test(FILE *, FILE *, FILE *, FILE *, FILE *, FILE *,FILE *,FILE *,FILE *,FILE*);
test.c
#include "test.h"
//Mandatory fields declaration
char uid[] = "865A80A01C70A9E0D5FC5F4D354A9155BF58CD483B1397C92614E5BC92317ACC";
char txn[] = "23da7b99-c561-4102-9df8-d37fbfe1";
char adhaarNo[] = "250241800087";
char ver [] = "1.0";
char *photo = (char *)malloc(sizeof(char)*size_photo);
char pseudonym[] = "2b6c55566d14459991513fb00bce34ed";
char name[] = "Amarjeet Sharma";
char input[] = "936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af";
void incorrect_val_test(FILE *ver, FILE *ts, FILE *txn, FILE *vtxn, FILE *uid, FILE *input, FILE *adhaarNo, FILE *photo, FILE *name, FILE *pseudonym)
{
//Some initialization and files are opened here....
photo = (char *)malloc(sizeof(char)*size_photo);
FILE *photos = fopen("./input/data.txt","r");
if(photos == NULL)
{
printf("Can't open data file.\n");
return;
}
i=0;
while((read_char = fgetc(photos))!= EOF)
{
if(read_char == '\n')
continue;
photo[i]= read_char;
i++;
}
// Some more processing done here
}
main.c
int main()
{
// Some files are opened here to read data.
incorrect_val_test(fp_ver, fp_ts, fp_txn, fp_vtxn, fp_uid, fp_input, fp_adhaarNo, fp_photo, fp_name, fp_pseudonym);
return 0;
}
当我编译时,它给出了以下错误信息
错误信息
warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
photo = (char *)malloc(sizeof(char)*size_photo);
error: incompatible types when assigning to type ‘FILE {aka struct _IO_FILE}’ from type ‘char’
photo[i]= read_char;
谁能指出我哪里出错了?
你可以像这样调用一个函数
char *photo = (char *)malloc(sizeof(char)*size_photo);
在 函数中 。这在 global 范围内是不允许的。删除 global 一个,保留 incorrect_val_test()
函数中的那个。
此外,请do not castmalloc()
和家人C
的return值。
解决方案:
- 在全局范围内定义
char *photo = NULL;
。 正如你所做的那样,在你的
incorrect_val_test()
中为photo
分配内存,比如char *photo = malloc(size_photo); //cast not required // sizeof(char) is guranteed to be 1
那么,你在函数参数列表incorrect_val_test()
函数中得到了FILE *photo
void incorrect_val_test(..., FILE *photo, ...)
影响全局 [=23=]。
恕我直言,你要的是写
void incorrect_val_test(..., FILE *photos, ...)
^
|
并且,在函数体内,
photos = fopen("./input/data.txt","r");
但是,那么,为什么要使用具有 单个字符差异 的变量名称?使用更详细且易于区分的内容。
注意:使用完photo
后,不要忘记free()
分配的内存以避免内存泄漏。
你有这个功能
void incorrect_val_test(..., FILE *photo, ...)
请注意,您有一个参数 shadows 全局变量。这就是你问题错误的原因。