赋值从指针生成整数而没有强制转换

时间:2015-10-09 06:15:59

标签: c pointers casting

struct libimg 
{
   Elf32_Phdr ph;
};

struct libimg limg = {
   {
      p_type: PT_LOAD,
      p_memsz: 2 * PAGE_SIZE
   }
};

static void makelib(void *r)
{
    limg.ph.p_vaddr = r;
}

Elf32_Phdr

中定义了linux/elf.h
typedef struct elf32_phdr{
   Elf32_Addr    p_vaddr;
   ....
 } Elf32_Phdr;

我想从参数中分配p_vaddr值。但我得到了这个警告assignment makes integer from pointer without a cast。我使用gdb进行检查,print r显示(void *)0x08040000

2 个答案:

答案 0 :(得分:1)

编译器警告您分配导致隐式转换。这样做是因为这可能是无意的,并且可能会产生不良影响。你可以通过首先使用正确的类型来解决这个问题:

static void makelib(Elf32_Addr r)
{
    limg.ph.p_vaddr = r;
}

这可能导致其他代码行生成警告,您应该在这些地方使用强制转换,例如:

makelib((Elf32_Addr)someVariable);

这个想法是在你将一个值的含义从A类改为B类的地方,这是一个简洁,慎重的决定。如果您不能在第一时间使用正确的类型,即someVariable不能Elf32_Addr,那么您应该这样做(强制转换)。

答案 1 :(得分:0)

Linux/arch/powerpc/boot/elf.h

 94 typedef struct elf32_phdr {
 95         Elf32_Word p_type;
 96         Elf32_Off p_offset;
 97         Elf32_Addr p_vaddr;
 98         Elf32_Addr p_paddr;
 99         Elf32_Word p_filesz;
100         Elf32_Word p_memsz;
101         Elf32_Word p_flags;
102         Elf32_Word p_align;
103 } Elf32_Phdr;

Elf32_Addr

typedef unsigned int Elf32_Addr;

最后,您要将void *分配给unsigned int

将其unsigned int或更好地投放到Elf32_Addr以避免警告:

limg.ph.p_vaddr = (Elf32_Addr)r;