簡體   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