Tag: void pointers

处理双重间接时避免不兼容的指针警告

假设这个程序: #include #include static void ring_pool_alloc(void **p, size_t n) { static unsigned char pool[256], i = 0; *p = &pool[i]; i += n; } int main(void) { char *str; ring_pool_alloc(&str, 7); strcpy(str, “foobar”); printf(“%s\n”, str); return 0; } ……有可能以某种方式避免GCC警告 test.c:12: warning: passing argument 1 of ‘ring_pool_alloc’ from incompatible pointer type test.c:4: note: expected ‘void **’ […]

为什么在将地址在指针中的内存中打印之前,我们必须将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);

是否允许从TYPE *转换为unsigned char *?

C99 – 特别是第6.2.6.1节第4段 – 规定允许将对象表示复制到unsigned char数组中: struct { int foo; double bar; } baz; unsigned char bytes[sizeof baz]; // Do things with the baz structure. memcpy(bytes, &baz, sizeof bytes); // Do things with the bytes array. 我的问题:我们不能通过简单的转换来避免额外的内存分配和复制操作吗? 例如: struct { int foo; double bar; } baz; unsigned char *bytes = (void *)&baz; // Do stuff […]

从void **转换为int

我有一个存储在void**指针中的动态2D数组,我只是想知道我应该如何转换/取消引用这些值以便打印它们? 这是我想要做的一个例子: /* Assume that I have a data structure called graph with some * element “void** graph” in it and some element “int order” */ void foo(graph_t *graph) { int **matrix; /*safe malloc works fine, it uses calloc to initialise it all to zeroes*/ matrix = safe_malloc(graph->order * sizeof(int*)); for (i = 0; i […]

当我知道每个元素的大小时,如何从void指针获取一个项目到数组?

当我想为教育目的编写自己的快速入口时,就会出现这种情况。 这就是我得到的: qsort(void* array, int count, int size, int(*compare)(const void*, const void*)); 我有数组中每个元素的大小,以及指向数组中第一个元素的指针。 如何获取该数组中的每个元素?

在C中将double转换为void *

我正在编写一个解释器,我希望能够将函数返回的任何值存储到void指针中。 我没有问题存储int和各种指针作为void指针,但我在尝试将double作为void指针进行转换时出错。 据我所知,双精度存储的位置与位级别的整数和指针不同,但我不明白为什么我不能将任何我想要的位放入指针(假设它有足够的内存分配),然后将它们取出,把它们当作双人。 是否可以使用我不知道的语法将double转换为void指针,或者我是否误解了void指针的工作原理?

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

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

替换realloc(C – > C ++)

在之前的一个问题中,我询问了类型转换指针,但是针对使用C ++分配系统而不是mallocs的更好解决方案。 (我正在将一些C代码转换为C ++) 但是,我仍然遇到类似function的问题: 我变了: tmp = malloc(sizeof(char*) * mtmp); –> tmp = new char*[mtmp]; 和 free(tmp) –> delete [] tmp; 但是,在以下函数中如何处理realloc: char* space_getRndPlanet (void) { int i,j; char **tmp; int ntmp; int mtmp; char *res; ntmp = 0; mtmp = CHUNK_SIZE; //tmp = malloc(sizeof(char*) * mtmp); <– replaced with line below tmp = […]

使用和解除引用(void **)

我想传递一个指向函数的“多态”数组。 我可以在没有警告的情况下做以下事情: foo (void* ptr); bar() { int* x; … foo(x); } gcc显然会自动将x转换为(void*) ,这只是花花公子。 但是,当我执行以下操作时,我会收到警告: foo (void** ptr); bar() { int** x; // an array of pointers to int arrays … foo(x); } note: expected ‘void **’ but argument is of type ‘int **’ warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled […]

使用void指针指向数组

我只是试图使用一个指向整数数组的void指针,我试着看看是否可以通过将数组转换回int来打印数组。 但它给了我一些随机价值。 你能告诉我哪里出错了吗? #include #include int main(){ int a[5]; int x; int j; a[0]=1; a[1]=2; a[2]=3; a[3]=4; void *arr=a; for(j=0;j<4;j++){ x = *(int *)(arr+j); printf("%d",x); } return 0; } 输出是这样的: 133554432131072512 为什么它不是针对数组的元素a []即1,2,3,4?