【问题标题】:warning - assignment makes pointer from integer without a cast [closed]警告-赋值使指针从整数而不进行强制转换[关闭]
【发布时间】:2019-10-31 11:23:10
【问题描述】:

我收到此警告“赋值使指针从整数而不进行强制转换” (标记在代码段中)代码工作正常,我做错了什么,我该如何解决这个警告?谢谢

 void Read_Keys(char *keys[MAX_LEN])  //Read the keys from input file 
{
    char c,Fname[MAX_LEN];

    gets(Fname);
    FILE *fptr = (fopen(Fname, "r")); // Input stream pointer assume

    if(fptr == NULL)
    {
        printf("No Such File...");
        exit(EXIT_FAILURE);
    }
    if(fptr) //if not empty get in
    {
        int i = 0;
        while((c = getc(fptr)) != EOF) //while loop copies each char from file
        {                             //to keys array
**          keys[i] = c; //          **                      WARNING IS HERE
            i++;
        }
        keys[i+1] = END; //ending point assume
    }
    fclose(fptr); //Close file for security issues
} ```

【问题讨论】:

  • 从不永远使用gets。这是一个 dangerous 函数,甚至已从 C 标准中删除。使用例如fgets 代替。
  • 就像警告说的那样,您正在尝试将单个字符写入指针。代码不可能正常工作。 c 甚至不应该是 char 而是 int
  • 另请注意,getc 返回一个 int 值,这对于与intEOF 进行比较非常重要。
  • 这段代码绝对不可能正常工作。你很幸运。
  • 最后关于您的问题,keys 真的应该是指向char指针数组(即字符串数组)吗?你如何使用这个功能?它应该做什么? END 是什么?请尝试创建一个minimal reproducible example 以向我们展示此功能在上下文中的工作原理。

标签: c pointers char


【解决方案1】:

参数键声明如下

char *keys[MAX_LEN]

编译器将其调整为以下声明

char **keys

所以在这个声明中

keys[i] = c;

左操作数的类型为char *,即它是一个指针,而右操作数的类型为char

所以编译器发出警告,因为这个赋值没有意义。

我怀疑在任何情况下参数都被错误地声明了。看来你的意思是下面的声明

void Read_Keys(char ( *keys )[MAX_LEN]);

也就是说,您正在尝试将二维数组传递给函数。但无论如何这段代码sn-p

    int i = 0;
    while((c = getc(fptr)) != EOF) //while loop copies each char from file
    {                             //to keys array
        keys[i] = c; //          **                      WARNING IS HERE
        i++;
    }
    keys[i+1] = END; //ending point assume
}

无效,因为将所有文件写入一条记录而不是记录数组是正确的。

【讨论】:

    【解决方案2】:

    您的keys 参数是MAX_LEN 指向char 的指针的数组。所以,如果你想在这个数组中分配一个值,它应该是一个指向字符类型的指针。在这里,getc() 返回一个字符,而不是指针。

    我想你期望的是void Read_Keys(char *keys),调用代码如下:

    char keys[MAX_LEN];
    
    Read_Keys(keys);
    

    因此,当调用Read_Keys 时,您的keys 数组将衰减为char * 指针。在Read_Keys 中,您可以使用索引访问所有数组元素,例如keys[2]

    显然,您还需要将数组长度传递给Read_Keys,因此该函数知道哪个数组索引有效,哪个无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多