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
指针只是与所有指向对象类型的指针赋值兼容。更正确的是:编译器必须知道元素类型的大小。数组大小本身可能是可变长度的。