我讨厌发布这个,因为有很多这些,但它们似乎都没有解决我所看到的问题。正常问题(未声明的函数,无意的强制转换,对基本指针的误解)似乎不适用于此处。这是我的代码的精简版本:
#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
任何帮助?
答案 0 :(得分:10)
uint8_t* buffer, curr, next;
您编写它的方式,buffer
是一个指针,而curr
和next
仅仅是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
结构是用于管理许多不同缓冲区的链接列表的一部分。