C语言中向void**的转换是否合法?两种调用场景分析
C语言中swapValues函数调用的合法性分析
先明确两个调用的合法性情况:
第一个调用:swapValues(&x, &y, sizeof(i));
正如注释所说,这个调用不合法。x是int*类型,取地址后得到的&x是int**类型,而swapValues要求的第一个参数是void**类型。C语言里,int**和void**是完全不同的指针类型,没有隐式转换规则支持这种直接传递,属于类型不匹配的非法调用。
第二个调用:swapValues(&p, &q, sizeof(i));
这个调用是合法的。因为p本身是void*类型,&p的类型就是void**,和函数参数的类型完全一致,完全符合函数的参数要求,不存在类型转换问题。
再补充看函数内部的逻辑合法性:
函数里把*av(void*类型)赋值给int* a,这是C语言允许的——void*可以和任意对象指针类型互相隐式转换。后续的memcpy调用中,int*类型的a、b会自动转换为void*(memcpy的参数要求是void*),这也完全符合规则,不会触发未定义行为。
内容的提问来源于stack exchange,提问作者0___________
相关产品推荐
相关产品推荐

