C 声明空洞数组

C 声明空洞数组,c,memory,C,Memory,我正在写一个复制文件的程序。我使用了一个缓冲区来存储函数提供的信息,然后将这些数据提供给函数。我使用了以下声明: static void buffer[BUFFER_SIZE]; 问题是我得到了错误错误:将“buffer”声明为空数组 我不明白为什么声明一个void数组是一个错误。如何声明没有特定类型的内存块?使用字符数组或无符号字符数组。您还可以声明无效指针: void* buffer; // just pointers for simple work with allocated pie

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

static void buffer[BUFFER_SIZE];
问题是我得到了错误
错误:将“buffer”声明为空数组


我不明白为什么声明一个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;

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

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

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

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

void *foo;
有效,以及
sizeof(foo)
,但
sizeof(*foo)
将无效

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


对于通用内存缓冲区,使用纯
char
无符号char
(甚至
uint8\u t
)数组。当我需要传递指向
str*
函数族的指针时,我通常更喜欢纯
char
,其中
无符号char
的数组将导致对不兼容指针的诊断。

这是如何操作的,虽然它不是您可能想要的空数组,但它是空指针数组;在该空指针的每个单元格中,可以指定任何内容

如果希望存储变量,只需将其强制转换为(
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 

+1,我相信OP不知道这是C中普遍存在的
byte
大小的类型。给定
void*
read()
write()
请求的数据类型。也许更重要的是,
void
的大小是多少?还有一个禅宗般的问题。。。求你了!:D@JörgenSigvardsson:是一个void吗?避免一个void,因为你的分配保证是void(:P)。一个void,一个void对象!不要在C中强制转换
malloc
的输出值。这在C常见问题解答中。读一下。活下去!当您执行
buffer=malloc(缓冲区大小)时
malloc
的返回值自动转换为缓冲区类型@chavaone不,它不是铸造的(这需要铸造操作员)。C中的
void
指针只是与所有指向对象类型的指针赋值兼容。更正确的是:编译器必须知道元素类型的大小。数组大小本身可能是可变长度的。