相关疑难解决方法(0)

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

我使用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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个错误意味着什么,以及如何解决它?

edit1:我找到了解决问题的方法:将缓冲区从void*转换为新的char*指针.

char *buffer2 = (char *) buffer;
memcpy(new_container, &buffer2[10], …
Run Code Online (Sandbox Code Playgroud)

c file memcpy

4
推荐指数
2
解决办法
4201
查看次数

为什么在将地址在指针中的内存中打印之前,我们必须将void指针强制转换为int或其他内容?

我不知道为什么是有必要铸造的void指针,int *char *打印地址的内容存储器之前,即使我们告诉printf()函数如何解释在内存中的数据?

假设我们有以下代码:

int main (void)
{
 void* c = malloc(4);
 printf("%d",*c);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么不可能这样做?

所以要明确我的问题是这是不可能的原因是什么?

编辑: 在所有的答案和研究之后,我仍然不确定编辑中的致命错误究竟在哪里.我感到困惑的主要原因是我的编译器(gcc)在告诉"取消引用void指针"时只给出一个警告.这是实际的错误吗?据我所知,即使有警告,该程序仍应编译.

EDIT2 我仍然感到困惑的是我们有一个ERROR和WARNING的原因看起来是完全独立的,但是由同一段代码生成:

pointer.c:7:13: warning: dereferencing 'void *' pointer                                                                                                                                                           
 printf("%d",*p);                                                                                                                                                                                                 
             ^~                                                                                                                                                                                                   
pointer.c:7:13: error: invalid use of void expression                                                                                                                                                             
 printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)

有些用户说只有在我们尝试使用derefenciation的结果时才会出现错误,并且警告是在我们为VOID指针实际分配内存时.

显然不是这种情况,因为如果我们删除printf行,我们确实只会得到一个警告但是完全没有一个警告.

pointer.c:6:8: warning: unused variable 'p' [-Wunused-variable]                                                                                                                                                   
 void * p=malloc(4);    
Run Code Online (Sandbox Code Playgroud)

c pointers void void-pointers dereference

4
推荐指数
2
解决办法
926
查看次数

如何在GCC中发生无效指针算术运算

int main()  
{  
    int a;  
    void *p;  
    p = &a;  
    printf("%ld\n",(long)p);  
    p = p+1;  
    printf("%ld\n",(long)p);  
}  
Run Code Online (Sandbox Code Playgroud)

在这个程序中,p+1只是将p的值递增1.我知道void pointer arithmetic是不可能的C,所以GCC隐式地这样做.如果是的话,那就是它char pointer.另外,dereferencing如果void指针隐式执行指针运算,为什么不可能使用void指针.

c gcc pointers void-pointers pointer-arithmetic

2
推荐指数
1
解决办法
2812
查看次数