Tag: void

双链表和void指针

我用void指针写了这个双链表 typedef struct list_el { void *data; struct list_el *prev; struct list_el *next; } list_el; typedef struct linked_list { int n_el; /*number of elements*/ list_el * head; /*pointer to the head*/ list_el * tail; /*pointer to the head*/ } linked_list; 我写了这些函数来处理它。 /*for list_el allocation*/ list_el * new_el ( void ) { return (list_el *) malloc(sizeof(list_el)); […]

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

我想知道为什么有必要在打印内存中的地址内容之前将void指针强制转换为int *或char * ,即使我们告诉printf()函数如何解释内存中的数据? 假设我们有以下代码: int main (void) { void* c = malloc(4); printf(“%d”,*c); return 0; } 为什么不可能这样做? 所以要明确我的问题是,这是不可能的原因是什么? 编辑:在所有答案和研究之后,我仍然不确定编辑中的致命错误究竟在哪里。 我感到困惑的主要原因是我的编译器(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); 有些用户说只有在我们尝试使用derefenciation的结果时才会出现错误,并且警告是在我们为VOID指针实际分配内存时。 显然不是这种情况,因为如果我们删除printf行,我们确实只会得到一个警告但是完全没有一个警告。 pointer.c:6:8: warning: unused variable ‘p’ [-Wunused-variable] void * p=malloc(4);

无法在C中使用void变量进行编译

test.c的 int main () { void a; return 0; } 我使用gcc编译,但它给了我一个错误: 错误:变量或字段’a’声明为void 从我在这里读到的,我以为我可以毫无问题地声明void变量。

将不同的结构传递给函数(使用void *)

我需要弄清楚如何将两个不同的结构传递给一个函数。 我尝试使用void *作为参数,但我收到错误: warning: dereferencing ‘void *’ pointer error: request for member left in something not a structure or union 成员权利相同的错误 这是我用一般术语做的(代码可能无法编译)。 struct A{ char *a; struct A *left, *right; } *rootA; struct B{ char *b; struct B *left, *right; } *rootB; void BinaryTree(void *root, void *s){ if(condition) root->left=s; else if(condition) BinaryTree(root->left, s); if(condition) root->right=s; […]

c分配不兼容的类型,指针问题?

嗨,我正在使用C,我有一个关于分配指针的问题。 struct foo { int _bar; char * _car[SOME_NUMBER]; // this is meant to be an array of char * so that it can hold pointers to names of cars } int foofunc (void * arg) { int bar; char * car[SOME_NUMBER]; struct foo * thing = (struct foo *) arg; bar = thing->_bar; // […]

void *是字面上的浮点数,如何投射?

所以我在我的C ++应用程序中使用这个C库,其中一个函数返回一个void *。 现在我对纯C来说并不是最敏锐的,但是听说过一个void *可以被投射到几乎任何其他的*类型。 我也知道我希望在这个函数的某个地方有一个浮点数。 所以我将void *转换为float *并取消引用float *,崩溃。 该死的! 我调试代码并在gdb中让它评估(float)voidPtr和low并且看到值是我期望和需要的! 但是等等,在编译期间不可能一样。 如果我写float number = (float)voidPtr; 它不编译,这是可以理解的。 所以现在的问题是,如何让我的浮动脱离这个虚弱的空虚*? 编辑:感谢H2CO3这已经解决了,但我看到很多答案和评论出现并且不再相信我可以在gdb中做(浮动)voidPtr。 这是截图。

为什么将“extern puts”转换为函数指针“(void(*)(char *))&puts”?

我正在查看来自不安全编程的示例abo3.c ,并且我没有在下面的示例中讨论转换。 有人可以开导我吗? int main(int argv,char **argc) { extern system,puts; void (*fn)(char*)=(void(*)(char*))&system; char buf[256]; fn=(void(*)(char*))&puts; strcpy(buf,argc[1]); fn(argc[2]); exit(1); } 那么 – 系统和投放的铸造是什么? 他们都返回一个int所以为什么把它变成无效? 我非常感谢对整个计划的解释。 [编辑] 谢谢你们的投入! Jonathan Leffler ,实际上代码有“坏”的原因。 它应该是可利用的,溢出缓冲区和函数指针等.mishou.org有一篇关于如何利用上述代码的博客文章。 其中很多仍然在我头上。 bta ,我从上面的博客文章中得知,转换系统会以某种方式阻止链接器删除它。 有一点不能立即明确的是系统和放置地址都写在同一个位置,我想这可能是gera所说的“因此链接器不会删除它”。 虽然我们讨论的是函数指针的主题,但现在我想问一个后续问题,即语法更清晰。 我正在使用函数指针查看一些更高级的示例,偶然发现这个令人厌恶的例子,取自托管shellcode的站点。 #include char shellcode [] =“some shellcode”; int main(void) { fprintf(stdout,“长度:%d \ n”,strlen(shellcode)); (*(void(*)())shellcode)(); } 所以数组被强制转换为返回void的函数,引用并调用? 这看起来很讨厌 – 所以上面代码的目的是什么? [/编辑]

访问struct:derefrencing指向不完整类型的指针

当我尝试使用并访问指向我的结构的指针时,我不断收到”dereferencing pointer to incomplete type”的恼人信息…. 例如在我的user.h文件中,我有这个typedef : typedef struct FacebookUser_t* User; 在我的user.c文件中包含user.h我有这个结构: struct FacebookUser_t {…}; 所以,当我需要一个指向该结构的指针时,我只使用User blabla; 它似乎工作,我将它添加到通用列表作为Element ,它是void* ,这是list.h的typedef: typedef void* Element; 当我从包含Element ( User )的列表中找回一个节点时,我无法访问它的成员,我做错了什么? 谢谢!

sizeof(void)在C中等于1?

可能重复: 虚空的大小是多少? 大家好 ! 我正在使用gcc编译我的C程序,只是偶然发现sizeof(void)是C中的1个字节。 这有什么解释吗? 我一直认为它是零(如果它真的没有存储)! 谢谢 !

(void)var实际上做了什么?

考虑以下main() : int main(int argc, char *argv[]) { return (0); } 在使用cc -Wall -Wextra编译时,会生成警告“未使用的参数”。 当我不需要在函数中使用参数时(例如在不使用其int参数的信号处理函数中),我习惯于执行以下操作: int main(int argc, char *argv[]) { (void)argc; (void)argv; return (0); } (对于那个特定的main() ,我有时会看到其他人这样做: argv = argv – argc + argc ) 但是(void)var实际上做了什么? 我知道(void)是一个演员,所以我想我正在抛弃变量? 变量是什么var; 线(没有演员)呢? 这是一个空任务,一个空表达式? 我想了解究竟发生了什么。