Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:访问位置不正确的内存中的字节_C_Malloc - Fatal编程技术网

C:访问位置不正确的内存中的字节

C:访问位置不正确的内存中的字节,c,malloc,C,Malloc,我已经分配了一个空数组 我需要访问已分配内存的字节 void* array = (void*) malloc(12); array[0] = 0; 它会返回以下错误: main.c:9: error: invalid use of void expression array[0] = 0; ^ 有办法吗? 谢谢 您需要使用char或unsigned char而不是void来访问字节: char *array = malloc(12); array[0] = 0; mal

我已经分配了一个空数组 我需要访问已分配内存的字节

void* array = (void*) malloc(12);
array[0] = 0;
它会返回以下错误:

main.c:9: error: invalid use of void expression
     array[0] = 0;
     ^
有办法吗?
谢谢

您需要使用
char
unsigned char
而不是
void
来访问字节:

char *array = malloc(12);
array[0] = 0;

malloc()
返回一个
void
指针,因为它不知道您正在分配的类型。您不能通过
void
指针访问内存;您需要告诉编译器如何处理内存块。要将其视为字节,请使用
char
unsigned char

您需要使用
char
unsigned char
而不是
void
来访问字节:

char *array = malloc(12);
array[0] = 0;

malloc()
返回一个
void
指针,因为它不知道您正在分配的类型。您不能通过
void
指针访问内存;您需要告诉编译器如何处理内存块。要将其视为字节,请使用
字符
无符号字符

您的
数组
是一个
无效
-指针。而
void
(在C中)表示“没有类型”。因此,当您取消引用它时(如
数组[0]
),编译器不知道这意味着什么

要访问字节,您需要一个
char
类型,它实际上是一个字节的C等价物(字符仍然可以放入(8位)字节的年代的残余)

因此,将数组声明为:

char * array = malloc(12);
还请注意,您不必强制转换
malloc
的结果(尤其是在您的情况下,因为它已经返回了
void*
)。而且,如果您只需要12个字节,并且只在本地使用它们(在声明它的函数或转换单元中),那么您可以使用“适当的数组”:

char array[12];

这增加了一个额外的好处,即您不需要在
之后释放它。

您的
数组
是一个
无效
-指针。而
void
(在C中)表示“没有类型”。因此,当您取消引用它时(如
数组[0]
),编译器不知道这意味着什么

要访问字节,您需要一个
char
类型,它实际上是一个字节的C等价物(字符仍然可以放入(8位)字节的年代的残余)

因此,将数组声明为:

char * array = malloc(12);
还请注意,您不必强制转换
malloc
的结果(尤其是在您的情况下,因为它已经返回了
void*
)。而且,如果您只需要12个字节,并且只在本地使用它们(在声明它的函数或转换单元中),那么您可以使用“适当的数组”:

char array[12];

这还有一个额外的好处,那就是你以后不需要
释放它。

所以当我创建了void指针时,我必须创建第二个char指针?@Peter:指针必须指向实际类型,然后你才能跟随它读写它所指向的内存。所以当我创建了void指针时,我必须创建第二个字符指针?@Peter:指针必须指向实际类型,然后才能跟随它读取或写入它指向的内存。在C中,您不必显式地强制转换到
void*
。从
T*
void*
的强制转换是隐式的。到j,多少字节应该
array+1
递增
array
?您不必在C中显式地强制转换到
void*
。从
T*
void*
的强制转换是隐式的。到J,数组+1
增量
array
应包含多少字节?