我正在编写一个复制文件的程序。我使用缓冲区来存储read()
函数提供的信息,然后将此数据提供给write()
函数。我用过这个宣言:
static void buffer[BUFFER_SIZE];
问题是我收到了错误error: declaration of ‘buffer’ as array of voids
。
我不明白为什么声明一个void数组是一个错误。如何在没有特定类型的情况下声明内存块?
答案 0 :(得分:9)
您无法声明数组void
的技术原因是void
是不完整的类型无法完成。必须知道数组元素的大小,但void类型没有大小。请注意,您同样无法声明void对象,如
void foo;
请注意,指向void的指针具有特定的大小,这就是
的原因void *foo;
有效,sizeof(foo)
也有效,但sizeof(*foo)
无效。
对于通用内存缓冲区,请使用普通char
或unsigned char
数组。当我需要将指针传递给char
函数系列时,我通常更喜欢普通str*
,其中unsigned char
数组将导致对不兼容指针的诊断。
答案 1 :(得分:5)
请改用char
或unsigned char
数组。
答案 2 :(得分:2)
声明数组时,编译器必须知道数组的大小。 void类型没有大小。所以编译器报告错误。
答案 3 :(得分:1)
这是你如何做到的,虽然它不是你想要的空洞数组,它是一个无效指针数组;在这个空指针的每个单元格中,你可以分配任何东西。
如果您希望存储变量,只需将其转换为(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
答案 4 :(得分:-1)
您也可以声明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;