繁体   English   中英

memcpy:警告:解除引用'void *'指针

[英]memcpy: warning: dereferencing ‘void *’ pointer

我使用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 *类型

警告是由于这个:

&buffer[10]

void没有大小, []运算符需要具体的数据类型才能以定义的方式运行。 这是一个警告可能是由于您的编译器以unsigned char *方式支持void* (例如,gcc具有此扩展名)。 但它不标准。 因此警告。

改变这个:

void *buffer = malloc(40);

对此:

unsigned char *buffer = malloc(40);

改变线

memcpy(new_container, &buffer[10], 20);

memcpy(new_container, (char *)buffer + 10, 20);

那是因为&buffer[10]求值为&(*(buffer + 10))因为数组下标运算符的优先级高于operator &address of 但是, buffer的类型为void *并且无法在void指针上执行指针运算,因为没有大小信息。 buffer上使用类型转换操作符(char *)可提供必要的大小信息
(char *)buffer + 10相当于buffer + 10 * sizeof(char)或变量buffer指向的缓冲区中第11个元素的地址。

错误/警告是为了行

memcpy(new_container, &buffer[10], 20);

在这里,您尝试访问buffer第11个元素。 但由于buffervoid * ,执行buffer[10]无效。

您需要将其定义为

char *buffer = malloc(40);

同样适用于new_container

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM