在C语言中,指针转双指针是否合法?相关赋值操作是否正确?
你的代码存在未定义行为,并非合法操作
嘿,咱们仔细拆解下你这段代码的问题——虽然它在一些编译器里没报错甚至看起来“能运行”,但本质上是不符合C语言规范的未定义行为,具体原因如下:
- 类型转换的语义错误:
&c是int*类型(指向int的指针),你通过强制类型转换把它变成了int**(指向int指针的指针)。C语言允许这种强制转换,但这只是让编译器闭嘴,并没有改变内存的实际类型。&c指向的内存区域是用来存储int类型值的,而不是存储int*指针的——哪怕在32位系统里int和指针大小相同,它们的类型语义完全不同。 - 解引用操作的致命问题:当你执行
*ppi = 888;时,你是把888当作一个int*指针的值,写入到&c指向的内存(也就是变量c的内存空间)。这时候:- 如果你的系统中int和指针大小一致(比如32位系统),
c的内存里会被写入888,看起来像是达到了你的目的,但这只是巧合; - 如果是64位系统,指针是8字节、int是4字节,这个操作会直接破坏
c后面的4字节内存,大概率导致程序崩溃或者出现不可预测的行为。
- 如果你的系统中int和指针大小一致(比如32位系统),
- 你真正需要的正确写法:如果只是想通过指针修改
c的值,用一级指针就足够了,完全不需要二级指针,代码如下:
这段代码类型匹配,完全符合C语言规范,没有任何风险。int c = 6; int* pi = &c; *pi = 888;
总结一下:编译器没报错不代表代码合法,强制类型转换会绕过编译器的类型检查,但带来的是未定义行为——今天可能正常运行,明天换个编译器、换个系统就会出问题。
内容的提问来源于stack exchange,提问作者Kelby Dinkel
相关产品推荐
相关产品推荐

