当指针指向指针时,我会收到警告:赋值从指针生成整数

时间:2013-08-30 18:59:29

标签: c pointers gcc-warning

我讨厌发布这个,因为有很多这些,但它们似乎都没有解决我所看到的问题。正常问题(未声明的函数,无意的强制转换,对基本指针的误解)似乎不适用于此处。这是我的代码的精简版本:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

extern void* malloc ( size_t size );

typedef struct {
    size_t      size;
    uint8_t*    buffer, curr, next;
} buffer_t;

void init( buffer_t* b, int size ) {
    b->size   = (size_t) size;
    b->buffer = (uint8_t*) malloc( sizeof(uint8_t) * b->size + 1 );
    b->curr   = (uint8_t*) b->buffer; // warning: assignment makes integer from pointer without a cast [enabled by default]
    b->next   = (uint8_t*) b->buffer; // warning: assignment makes integer from pointer without a cast [enabled by default]
}

int main ( int argc, char* argv[] ) {
    buffer_t buf;

    init( &buf, 16 );

    return 0;
}

没有演员阵容就失败了,但是把它们放进去会让它变得更加明显。

我正在使用gcc 4.7.2在MinGW / MSYS下编译WinXP(是的,是的,是的)。使用以下命令:

gcc -std=c99 -Wall -o testing test.c

任何帮助?

3 个答案:

答案 0 :(得分:10)

uint8_t*    buffer, curr, next;

您编写它的方式,buffer是一个指针,而currnext仅仅是uint8_t。你可能意味着:

uint8_t    *buffer, *curr, *next;

更好(不太容易出错)就是让每个字段都在自己的行上。

答案 1 :(得分:1)

你已经在结构声明中声明了curr和next作为uint8_t(而不是指向uint8_t的指针)。 试试这个。 uint8_t * buffer,* curr,* next;

答案 2 :(得分:0)

这是一个很好的问题。以面值接受您的结构并假设curr和next应指向同一结构的其他事件(还需要对其他答案进行代码修改),然后init应编码为:

void init( buffer_t* b, int size ) {
    b->size   = (size_t) size;
    b->buffer = (uint8_t*) malloc( sizeof(uint8_t) * b->size + 1 );
    b->curr   = b;     // a self-pointer to this buffer_t
    b->next   = NULL;  // pointer to next buffer_t structure
}

b->buffer指向堆上分配的存储,而buffer_t结构是用于管理许多不同缓冲区的链接列表的一部分。