3

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

#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

有什么帮助吗?

4

3 回答 3

10
uint8_t*    buffer, curr, next;

您编写它的方式buffer是一个指针,curr并且next只是uint8_ts。你可能的意思是:

uint8_t    *buffer, *curr, *next;

更好(不太容易出错)将每个字段放在自己的行上。

于 2013-08-30T19:01:32.813 回答
1

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

于 2013-08-30T19:18:40.270 回答
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结构是用于管理许多不同缓冲区的链表的一部分。

于 2013-08-30T19:30:20.303 回答