我正在编写一个复制文件的程序。我使用了一个缓冲区来存储read()
函数提供的信息,然后将这些数据提供给write()
函数。我使用了这个声明:
static void buffer[BUFFER_SIZE];
问题是我得到了错误error: declaration of ‘buffer’ as array of voids
。
我不明白为什么声明一个 void 数组是一个错误。如何声明没有特定类型的内存块?
我不明白为什么声明一个 void 数组是一个错误。
您不能声明数组的技术原因void
是它void
是不完整的类型,无法完成。必须知道数组元素的大小,但 void 类型没有大小。请注意,您同样无法声明 void 对象,如
void foo;
请注意,指向 void 的指针具有特定的大小,这就是为什么
void *foo;
是有效的,以及sizeof(foo)
,但sizeof(*foo)
将是无效的。
如何声明没有特定类型的内存块?
char
对于通用内存缓冲区,请使用普通或unsigned char
(或什至uint8_t
)数组。char
当我需要将指针传递给函数族时,我通常更喜欢简单str*
,其中数组unsigned char
会导致关于不兼容指针的诊断。
char
使用or的数组unsigned char
。
声明数组时,编译器必须知道数组的大小。void 类型没有大小。所以编译器报错。
这就是你的做法,虽然它不是你可能想要的 void 数组,但它是一个 void 指针数组;在这个 void 指针的每个单元格中,您可以分配任何内容。
如果您想存储变量,只需将其转换为 ( void*
),这是一个示例:
void *XPoint[5] = { 0 };
XPoint[0] = (void*)5; // int
XPoint[1] = "Olololo!"; // char*
XPoint[2] = (void*)'x'; // char
XPoint[3] = (void*)structA.nNum; // struct int
您还可以声明 void 指针:
void* buffer;
// just pointers for simple work with allocated piece of memory
char* chBuf;
long* intBuf;
然后对该指针使用 malloc() 并像使用任何数组(char、short、long、float、double 或您自己的类型)一样使用这块内存。在这种情况下,不要忘记使用 free() 来避免内存泄漏。
buffer = malloc (BUFFER_SIZE);
if (buffer==NULL)
exit (1);
// init our buffers
chBuf=(*char)buffer;
intBuf=(*long)buffer;