如何从void *转换回int
如果我有
int a= 5; long b= 10; int count0 = 2; void ** args0; args0 = (void **)malloc(count0 * sizeof(void *)); args0[0] = (void *)&a; args0[1] = (void *)&b;
如何从args [0]和args0 [1]转换回int和long? 例如
int c=(something im missing)args0[0] long d=(something im missing)args1[0]
假设你的&a0和&b0应该是&a和&b,并且你的意思是设置长d的args0 [1],你已经存储了一个指向args0 [0]的指针和一个指向args0 [1]中b的指针。 这意味着您需要将它们转换为正确的指针类型。
int c = *((int *)args0[0]); int d = *((long *)args0[1]);
要字面回答你的问题,你会写
int c = *((int *)args0[0]); long d = *((long *)args[1]);
关于你的代码我可能会担心的是你为指向你的位置的指针分配了空间,但是你没有为值本身分配内存。 如果您希望将这些位置保留在本地范围之外,则必须执行以下操作:
int *al = malloc(sizeof(int)); long *bl = malloc(sizeof(long)); *al = a; *bl = b; void **args0 = malloc(2 * sizeof(void *)); args0[0] = al; args0[1] = bl;
试试这个:
int c = *( (int *) args0[0]); long d = *( (long *) args0[1]);
您需要告诉它,当您取消引用时,void *应该被解释为int *或long *。
int a = 5; long b = 10; void *args[2]; args[0] = &a; args[1] = &b; int c = *(int*)args[0]; long d = *(long*)args[1];
虽然其他人已经回答了您的问题,但我会对您的代码段的第一部分中的最后三行做出评论:
args0 = (void **)malloc(count0 * sizeof(void *)); args0[0] = (void *)&a; args0[1] = (void *)&b;
以上内容写得更好:
args0 = malloc(count0 * sizeof *args0); args0[0] = &a; args0[1] = &b;
malloc()
调用更容易以这种方式读取,并且不易出错。 由于C保证与对象指针和void指针之间的转换,因此在最后两个语句中不需要强制转换。
如果您正在测试,我建议使用它作为外部函数,以获得更多可读性:
int get_int(void* value){ return *((int*) value); } long get_long(void* value){ return *((long*) value); }
然后在你的代码中:
int c = get_int(args0[0]); long d = get_long(args0[1]);
这应该工作。