【问题标题】:unexpected initialization of global variable全局变量的意外初始化
【发布时间】:2015-07-18 03:03:36
【问题描述】:

我的头文件为:

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
}

ma​​in.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;
}

当我编译时它会给出以下错误消息

错误信息

警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types]
photo = (char *)malloc(sizeof(char)*size_photo);
错误:从“char”类型分配给“FILE {aka struct _IO_FILE}”类型时类型不兼容
照片[i]= read_char;

谁能指出我哪里出错了?

【问题讨论】:

  • 为什么要分配给photo 两次?什么是read_char,它在哪里声明/定义?还有标准的don't cast the result of malloc in C
  • 我没有在你的头文件中看到声明!。在源文件中定义变量并在头文件中声明。
  • 您确定您使用的是 C 编译器,而不是 C++ 编译器吗?
  • 是的,编译器是 C。

标签: c linux pointers gcc initialization


【解决方案1】:

你可以像这样调用函数

 char *photo = (char *)malloc(sizeof(char)*size_photo);

函数中。这在 global 范围内是不允许的。删除 global 之一,将现有的留在 incorrect_val_test() 函数中。

另外,请do not castmalloc()C中的家人的返回值。

解决方案:

  1. 在全局范围内定义char *photo = NULL;
  2. 完成后,将内存分配给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, ...)

它会影响全局 char * photo

恕我直言,你想要的就是写

 void incorrect_val_test(..., FILE *photos, ...)
                                         ^
                                         |

并且,在函数体内,

 photos = fopen("./input/data.txt","r");

但是,那么,为什么要使用具有单个字符差异的变量名称呢?使用更详细且易于区分的内容。

注意:使用完photo后,不要忘记free()分配的内存以避免内存泄漏。

【讨论】:

  • 但是照片在头文件中声明并在函数内部的源文件中定义。那为什么会报错。
  • @AbhijatyaSingh 哎呀,错过了澄清。摆脱全局范围内的malloc()。 :-)
【解决方案2】:

你有这个功能

void incorrect_val_test(..., FILE *photo, ...)

请注意,您有一个遮蔽全局变量的参数。这就是您在问题中出错的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多