声明一系列空洞

时间:2012-04-27 08:18:44

标签: c memory

我正在编写一个复制文件的程序。我使用缓冲区来存储read()函数提供的信息,然后将此数据提供给write()函数。我用过这个宣言:

static void buffer[BUFFER_SIZE];

问题是我收到了错误error: declaration of ‘buffer’ as array of voids

我不明白为什么声明一个void数组是一个错误。如何在没有特定类型的情况下声明内存块?

5 个答案:

答案 0 :(得分:9)

您无法声明数组void的技术原因是void不完整的类型无法完成。必须知道数组元素的大小,但void类型没有大小。请注意,您同样无法声明void对象,如

void foo;

请注意,指向void的指针具有特定的大小,这就是

的原因
void *foo;

有效,sizeof(foo)也有效,但sizeof(*foo)无效。

对于通用内存缓冲区,请使用普通charunsigned char数组。当我需要将指针传递给char函数系列时,我通常更喜欢普通str*,其中unsigned char数组将导致对不兼容指针的诊断。

答案 1 :(得分:5)

请改用charunsigned 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;