5

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

static void buffer[BUFFER_SIZE];

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

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

4

5 回答 5

13

我不明白为什么声明一个 void 数组是一个错误。

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

void foo;

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

void *foo;

是有效的,以及sizeof(foo),但sizeof(*foo)将是无效的。

如何声明没有特定类型的内存块?

char对于通用内存缓冲区,请使用普通或unsigned char(或什至uint8_t)数组。char当我需要将指针传递给函数族时,我通常更喜欢简单str* ,其中数组unsigned char会导致关于不兼容指针的诊断。

于 2012-04-27T08:36:25.710 回答
5

char使用or的数组unsigned char

于 2012-04-27T08:20:00.780 回答
2

声明数组时,编译器必须知道数组的大小。void 类型没有大小。所以编译器报错。

于 2012-04-27T08:26:41.537 回答
1

这就是你的做法,虽然它不是你可能想要的 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 
于 2014-03-16T21:55:28.940 回答
-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;
于 2012-04-27T08:23:32.540 回答