Tag: void pointers

指向void指针所需的显式转换

我有以下function签名 int foo(void **) 并试图给它一个指向char指针的指针,即char ** 。 我的编译器抱怨以下警告 argument of type “char **” is incompatible with parameter of type “void **” 这是预期的吗? 我知道将一个char *传递给一个期望void *的函数void *不需要显式转换,但这对指针指针是否正确? 注意:这显然是一个C问题。 如果不同的C版本对此有不同的看法,我会感兴趣。

取消引用void指针

为了更好地理解这篇文章中给出的答案,有人可以向我解释是否可以实现以下循环缓冲区,如果没有,为什么不能。 #define CB_TYPE_CHAR 0 #define CB_TYPE_FLOAT 1 … typedef struct CBUFF { uint16 total; /* Total number of array elements */ uint16 size; /* Size of each array element */ uint16 type; /* Array element type */ uint16 used; /* Number of array elements in use */ uint16 start; /* Array index of first unread […]

Malloc和Void指针

我正在研究这个malloc函数,我可以使用一些帮助: static void *malloc(int size) { void *p; if (size = free_mem_end_ptr) error(“Out of memory”); malloc_count++; return p; } 我知道malloc func为任何类型分配内存空间,如果有足够的内存,但我不理解的行是: p = (void *)malloc_ptr; malloc_ptr += size; 它如何指向任何类似的数据类型? 我只是无法理解void指针或其位置。 注意:malloc_ptr是unsigned long

通用性与类型安全性? 在C中使用void *

来自OO(C#,Java,Scala),我非常重视代码重用和类型安全的原则。 上述语言中的类型参数可以完成这项工作并启用通用数据结构,这些结构既是类型安全的,也不会“浪费”代码。 当我陷入C时,我意识到我必须做出妥协,我希望它是正确的。 我的数据结构在每个节点/元素中都有一个void * ,我失去了类型安全性,或者我必须为我想要使用它们的每种类型重新编写我的结构和代码。 代码的复杂性是一个显而易见的因素:遍历数组或链表是微不足道的,并且在结构*next添加*next不是额外的努力; 在这些情况下,不尝试重用结构和代码是有意义的。 但对于更复杂的结构,答案并不那么明显。 还有模块化和可测试性:将类型及其操作与使用该结构的代码分离,使测试更容易。 反之亦然:在一个结构上测试一些代码的迭代,而它试图做其他事情变得混乱。 那么你的建议是什么? void *和重用或类型安全和重复的代码? 有没有一般原则? 当我不适合时,我是否试图强迫OO进行程序化? 编辑 :请不要推荐C ++,我的问题是关于C!

调用realloc后是否需要初始化(设置为0)内存?

我需要实现一个指向typedef指针的简单动态指针数组。 每次用户请求时使用realloc,数组大小将增加sizeof(指针)。 所以我拥有的是: #include #include #include typedef void* node; void printmem(node* a, int c) { int i; for (i = 0; i < c; ++i) { printf("%d\t\t%p\n", i, a[i]); } } int main(void) { node* nodes = NULL; int i = 0, count = 20; for (i = 0; i < count; ++i) { nodes […]

sizeof void指针

为什么sizeof void指针2 ?

如何正确使用void **指针?

我试图使用双void指针,但我对使用有点困惑。 我有一个包含void **数组的结构。 struct Thing{ void ** array; }; struct Thing * c = malloc (sizeof(struct Thing)); c->array = malloc( 10 * sizeof(void *) ); 所以如果我想为每个指针分配一个不同的对象并尝试检索该值 // Option 1 *(c->array + index) = (void *) some_object_ptr; // Option 2 c->array[index] = (void *) some_object_ptr; 然后,我有另一个函数给出(void *) item指向每个单元格,而不是some_object_ptr 。 如果我想检索some_object_ptr指向的值, 我应该这样做 function return type is ‘void […]

如何从单个函数返回不同的类型

我有以下c代码: #include #include void *func(int a) { if (a==3) { int a_int = 5; int *ptr_int = &a_int; return (void *)ptr_int; } else if (a==4) { char a_char = ‘b’; char *ptr_char = &a_char; return (void *)ptr_char; } else { fprintf(stderr, “return value is NULL”); return NULL; } } int main (int argc, char *argv[]) […]

struct的access元素传递给void *指针

我正在使用二叉搜索树数据结构来对具有类型定义的一系列结构进行排序: typedef struct { char c; int index; } data_t; typedef struct node node_t; typedef node { void *data; node_t *left; node_t *right; } node_t typedef来自为此目的提供给我的库,可能带有void *指针以确保多态性。 node将传递给函数: static void *recursive_search_tree(node_t *root, void *key, int cmp(void*,void*)) 在recursive_search_tree函数中,我希望能够修改代码以使用index元素作为条件来查找最接近字符数组的线性传递索引的匹配,这最终将涉及传递给*key的data_t *key和key->index在函数内被访问。 问题 是否可以访问key->index其中key是指向data_t结构的void* ,或者只有在data_t被声明为key的类型时才可能这样data_t ? 我试图做后者,但即使将指针强制转换为int似乎也没有通过编译器。

在不同平台上使用void指针

我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符。 它为什么以及究竟是什么问题? int x=100; int *pi=&x; printf(“value of pi is: %p”,(void*)pi);