C++结构体初始化后按引用传递取值出现随机数的原因排查
结构体初始化后传指针获取随机数的问题分析
我尝试通过以下方式初始化结构体,随后将其按引用传递并尝试获取值,但得到的是随机数,这似乎表明该地址中无有效内容。请问这是什么原因?
你的代码片段如下:
#include <iostream> using namespace std; struct newStruct { int numberOne; int numberTwo; int numberThree; }; newStruct initializer{ 1,2,3 }; void printStruct(struct newStruct* inputNew) { printf("This is the output %d\n", inputNew->...
首先看你写的printStruct函数只完成了一半,但从问题现象反推,大概率是调用函数时的指针传递出了问题,导致访问了无效内存,才会读出随机数。我给你拆解几个常见原因和解决办法:
1. 最可能的问题:传参时没正确取结构体的地址
比如你如果是这么调用函数的:
// 错误:传空指针,访问的是无效地址 printStruct(nullptr); // 错误:直接传结构体值,类型不匹配(编译器会报错,但强制转换后会得到无效指针) printStruct(initializer);
这两种情况都会让函数里的inputNew指向无效内存,读出来的自然是随机垃圾值。
正确的调用方式应该是用&符号取全局变量initializer的地址:
printStruct(&initializer);
2. 函数内部的成员访问写错了(或者没写完)
你代码里的inputNew->...明显没写完,比如要访问numberOne的话,得写成inputNew->numberOne,如果成员名写错了(比如写成numOne),编译器会报错,但如果是某些特殊情况(比如老编译器的宽松模式),可能会访问到结构体里的未知内存区域,读出随机数。
完整的正确函数实现应该是这样(还可以加个空指针判断避免崩溃):
void printStruct(struct newStruct* inputNew) { if (inputNew != nullptr) { printf("numberOne: %d, numberTwo: %d, numberThree: %d\n", inputNew->numberOne, inputNew->numberTwo, inputNew->numberThree); } else { printf("传入的指针无效,请检查参数!\n"); } }
3. 排除悬空指针的情况
如果你的initializer是定义在某个局部函数里的(比如main函数内部),然后你把它的地址传给了一个在它生命周期结束后才执行的函数,那这个指针就变成了悬空指针,访问的是栈上已经释放的垃圾数据。不过看你现在的代码,initializer是全局变量,生命周期覆盖整个程序,所以这种情况可以直接排除。
总的来说,先检查函数调用时有没有正确传递&initializer,再确认函数内部的成员访问是否正确,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者parhloo sab kuch
相关产品推荐
相关产品推荐

