我使用read()函数从文件中读取40个字符,并且需要从10的偏移量中复制20个长度。换句话说,我需要从第10个到第30个字符进行memcpy一个新的内存地址。但是,当我运行我的代码(参见下文)时,我收到了警告消息:warning: dereferencing ‘void *’ pointer
int main()
{
void *buffer = malloc(40);
int fd = open("example20.txt", O_RDONLY);
printf("the value of fd is %d \n", fd);
/* read 40 characters from the file */
int bytes_read = read(fd, buffer, 40);
void *new_container = malloc(20);
/* copy from buffer, starting offset at 10 for length of 20 */
memcpy(new_container, &buffer[10], 20);
printf("new_container is %s \n", (char *) new_container);
return 0;
}
我想知道这个错误意味着什么,以及如何解决它?
edit1:我找到了解决问题的方法:将缓冲区从void *转换为新的char *指针。
char *buffer2 = (char *) buffer;
memcpy(new_container, &buffer2[10], 20);
edit2:我发现了一种在memcpy中使用void *指针的方法:memcpy(new_container, buffer+10, 20)
;以这种方式变量“buffer”可以是void * type
答案 0 :(得分:6)
警告是由于:
&buffer[10]
void
没有大小,[]
运算符需要具体的数据类型才能以定义的方式运行。这是一个警告可能是由于您的编译器以void*
方式支持unsigned char *
(例如,gcc具有此扩展名)。但它并不标准。因此警告。
改变这个:
void *buffer = malloc(40);
对此:
unsigned char *buffer = malloc(40);
答案 1 :(得分:6)
更改行
memcpy(new_container, &buffer[10], 20);
到
memcpy(new_container, (char *)buffer + 10, 20);
因为&buffer[10]
评估为&(*(buffer + 10))
,因为数组下标运算符的优先级高于address of
运算符&
。但是,buffer
的类型为void *
,并且无法在void
指针上执行指针运算,因为没有大小信息。使用(char *)
上的类型转换操作符buffer
提供必要的大小信息,以便(char *)buffer + 10
等同于buffer + 10 * sizeof(char)
或11
的地址缓冲区中的元素由变量buffer
指向。
答案 2 :(得分:3)
错误/警告是针对行
memcpy(new_container, &buffer[10], 20);
您正在尝试访问buffer
的第11个元素。但由于buffer
为void *
,因此buffer[10]
无效。
您需要将其定义为
char *buffer = malloc(40);
同样适用于new_container
。