【问题标题】:Assignment makes pointer from integer warning赋值使指针来自整数警告
【发布时间】:2012-01-07 23:31:22
【问题描述】:

标题:

#ifndef BIT_H_INCLUDE_GUARD
#define BIT_H_INCLUDE_GUARD

typedef unsigned char byte;

typedef struct{
    size_t* size;
    byte* map;
} bit;

bit* bdcteate(byte* size);

#endif /* BIT_H_INCLUDE_GUARD */

来源:

#include <stdlib.h>
#include "bit.h"

bit* bdcreate(byte* size){
    bit* d;
    byte i;
    size_t s = 0;
    for(i = 1; i < size[0]; i++){
        s += (size_t) size[i];
    }
    if(!(d = malloc(sizeof(bit)))){
        return (bit*) NULL;
    }
    if(!(d->size = malloc(sizeof(size_t)))){
        return (bit*) NULL;
    }
    if(!(d->map = malloc(s * sizeof(byte)))){
        return (bit*) NULL;
    }
    *d->size = s;
    return (bit*) d;
}

主要:

#include <stdlib.h>
#include "bit.h"

void main(void){
    byte *b, i;
    byte size = 9;
    b = malloc((size+1) * sizeof(byte));
    b[0] = size;
    for(i = 1; i <= size; i++){
        b[i] = (b[i-1] + 10);
    }   

    bit* dict;
    if(!(dict = bdcreate(b))){ /* warning: assignment makes pointer from integer without a cast */
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

正如您在注释行中看到的那样,我得到“警告:赋值使指针从整数而不进行强制转换”,尽管我尝试明确声明我正在返回一个指针。

我正在使用 gcc (gcc -o test main.c bit.c) 进行编译,并且程序 似乎 运行正常。

我应该忽略它,还是它会在我睡觉的时候回来咬我?

【问题讨论】:

  • 确保注意所有警告,包括有关隐式声明的警告。
  • 另外,如果第二个或第三个 malloc 失败,您将有内存泄漏。
  • 是的,我知道内存泄漏,但我认为这段代码已经足够了!!!
  • 你应该添加 gcc 选项 -Wall-Werror 这样你就可以捕捉到这种东西。

标签: c header gcc-warning


【解决方案1】:

在您的标题中:

bit* bdcteate(byte* size);
        ^ this is a typo

这意味着编译器会在你的 main 中为 bdcreate 推断一个默认签名,并且默认签名返回一个 int

【讨论】:

    【解决方案2】:

    bit.h 中有一个错字。 “bdcteate”应该是“bdcreate”。所以在 bit.h 中没有 bdcreate 的前向声明,这意味着编译器假定 main 中的调用返回 int。代码仍然可以工作,因为在 CPU 上,您使用的 int 足够大以包含指针,或者剥离的位不会使结果指针无效。

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2013-06-21
      • 2016-09-16
      • 2012-05-09
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多