Tag: void pointers

如何在c中使用void *制作generics函数?

我有一个incr函数将值递增1我想让它通用,因为我不想为相同的function创建不同的函数。 假设我想将int , float , char增加1 void incr(void *vp) { (*vp)++; } 但我知道的问题是Dereferencing a void pointer is undefined behaviour 。 有时可能会出错: Invalid use of void expression 。 我的main是: int main() { int i=5; float f=5.6f; char c=’a’; incr(&i); incr(&f); incr(&c); return 0; } 问题是如何解决这个问题? 有没有办法只在C解决它 要么 我必须为每种数据类型定义incr()吗? 如果是,那么什么是使用void * swap()和sort()有同样的问题。我想用相同的函数交换和排序各种数据类型。

当sizeof(char)!= 1时,C中的字节精度指针算术

如何以单字节精度可移植地执行指针运算? 请记住: char在所有平台上都不是1个字节 sizeof(void) == 1仅作为GCC中的扩展名提供 虽然某些平台可能具有指针deref指针对齐限制,但算术仍可能需要比最小基本POD类型的大小更精细的粒度

can void *用于存储函数指针?

void *以这样的方式定义,它可以指向任何东西。 那么它可以用来指向一个函数(int send())吗? int send(); void* p = send; 可能吗? 当我这样使用时,它没有向我显示错误原因? 如果没有,有没有办法将所有指针存储在一个变量中?

C:来自void指针的外推类型

假设一个函数将void指针作为参数,如下所示: int func(void *p); 我们如何确定或猜测p指向的类型?

我可以对C中的void *指针进行算术运算吗?

这是有效的 void *p = &X; /* some thing */ p += 12; 如果是的话,p现在指向什么? 我有(第三方)代码执行此操作(并编译干净),我的猜测是void *被视为char *。 我信赖的K&R对此话题保持沉默(ish) 编辑:我的小测试应用程序在gcc 4.1.1上正常运行并将void *视为char *。 但是g ++ barfs 我知道如何正确地做到这一点。 我需要知道是否必须清理此代码库以找到它完成的所有位置。 BTW gcc -pedantic发出警告 摘要: C规范含糊不清。 它表示在表示和用作函数参数方面void * = char *。 但它对指针算法没有提及。 gcc(4)允许它并将其视为char * g ++拒绝它 gcc -pedantic警告它 vs2010 c和c ++都拒绝它

使用void *键入punning而不破坏C99中的严格别名规则

我最近遇到了严格的别名规则,但是我无法理解如何使用void *来执行类型惩罚而不违反规则。 我知道这违反了规则: int x = 0xDEADBEEF; short *y = (short *)&x; *y = 42; int z = x; 而且我知道我可以安全地使用C99中的联合进行类型惩罚: union{ int x; short y; } data; data.x = 0xDEADBEEF; data.y = 42; int z = data.x; 但是如何在C99中使用void *来安全地执行类型惩罚呢? 以下是正确的: int x = 0xDEADBEEF; void * helper = (void *)&x; short *y = (short *)helper; […]

void指针作为参数

以下C片段: […] void f1(void* a){ printf(“f(a) address = %p \n”,a); a = (void*)(int*)malloc(sizeof(int)); printf(“a address = %p \n”,a); *(int*)a = 3; printf(“data = %d\n”,*(int*)a); } void f(void){ void* a1=NULL; printf(“a1 address = %p \n”,a1); f1(a1); printf(“a1 address = %p \n”,a1); printf(“Data.a1 = %d\n”,*(int*)a1); } […] 结果是 a1 address = (nil) f(a) address = (nil) a […]

如何将整数转换为void指针?

在C语言中使用Threads时,我正面临警告 “警告:从不同大小的整数转换为指针” 代码如下 #include #include #include #include void *print(void *id) { int a=10; printf(“My thread id is %ld\n”,pthread_self()); printf(“Thread %d is executing\n”,id); return (void *) 42; } int main() { pthread_t th[5]; int t; int i; int status; void *ret; for(i=0;i%d\n”,(int *)ret); } pthread_exit(NULL); } 任何人都可以解释如何将一个整数传递给接收(void *)作为参数的函数吗?

void时指针算法未知大小

在Visual Studio C ++版本9(也可能是其他版本)中,代码如下: int a = sizeof(void); void const *b = static_cast(“hello world”); b += 6; 生成这些 错误 : error C2070: ‘void’: illegal sizeof operand error C2036: ‘const void *’ : unknown size 此代码在GCC下工作,它将sizeof(void)视为1 。 有没有办法绕过这个限制,因为为了指针运算而显式地转换为char *会增加混淆( void *被很好地识别并用作指向原始内存的无类型指针)。 Update0 请注意,我很清楚标准的存在。 我想做原始指针算术。 我把sizeof(void)表示我很清楚它不是1的原因是问题的原因。 代码示例仅用于演示生成错误所需的内容。 我知道这不是使用void的“正常”方式,但这是C,这些事情发生了。 是的,人们需要在低级别这样做。 我不是在追求原因,我是在追求如何。 如果你想知道原因,请查看一些内核源代码或友好的glibc。 UPDATE1 看来这个问题引起了很大的混乱。 问题不在于为什么 sizeof(void) == 1不是标准的,而是什么时候不做。 […]

转换void指针

我在旧的C代码中看到了很多以下内容: type_t *x = (type_t *) malloc(…); 从malloc()返回指针的重点是什么,因为它是void * ? 是因为较旧的C编译器不支持void指针而malloc()用于返回char *而不是?