未初始化的值是由堆栈分配创建的
Uninitialised value was created by a stack allocation
我使用工具Valgrind调试了我的代码。它显示了此函数中的错误。我在下面给出了错误和我的函数。我不知道这里出了什么问题?我该如何纠正?我的错误是.
未初始化的值是由0x80996D7处的堆栈分配创建的:cdtojd(std::string const&)
我的代码是.
double cdtojd(const string &cdate);
double cdtojd(const string &cdate)
{
int dd,mm,yy;
int y,m;
double jd=0;
//mm = atoi(cdate.substr(0,2).c_str());
//dd = atoi(cdate.substr(2,2).c_str());
//yy = atoi(cdate.substr(4,4).c_str());
sscanf(cdate.c_str(),"%2d%2d%4d",&mm,&dd,&yy);
//cout<<mm<<"..."<<dd<<"...."<<yy<<endl;
y = (yy - 1900) * 372;
m = (mm-1) * 31;
jd = dd + m + y;
return jd;
}
错误的含义本质上是在分配变量之前使用了变量。这可能适用于的变量只有dd
、mm
和yy
。
这意味着您的sscanf
调用并没有同时写入这三个调用。如果您输入的日期没有完全指定,就会发生这种情况。
请注意,sscanf
返回一个值,告诉您它写入了多少变量。您应该检查返回值,如果不返回3,则中止(或填充一些默认值),因为这样并不是所有字段都已填充。
sscanf没有错误检查,这意味着一些变量可能会保持未初始化状态,然后使用,例如
std::string str = "invalid";
unsigned int dd,mm,yy;
cout << dd << " " << mm << " " << yy << endl;
cout << "Arguments read: " << sscanf(str.c_str(),"%2d %2d %4d",&mm,&dd,&yy) << endl;
cout << dd << " " << mm << " " << yy;
上述代码可能作为输出发出:
32550 3249645428 32550
Arguments read: 0
32550 3249645428 32550
其中所有三个参数仍然未初始化。
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- C++析构函数调用两次,堆栈分配的复合对象
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 何时在函数中声明堆栈分配变量?
- 使用 std::map 的递归堆栈分配如何工作?
- tcmalloc 与纯堆栈分配性能有多接近
- 安全分配堆栈分配的阵列
- C++ 中的黑白堆分配对象和堆栈分配对象的性能差异
- 跟踪(堆栈分配)对象
- 堆栈分配的确切时间
- 未初始化的值是由堆栈分配 - Qt - C++创建的
- 用于堆栈分配对象的C++虚拟析构函数内联
- C STD :: BAD_ALLOC来自堆栈分配
- 是使用COM创建的对象,将采用分配或堆栈分配的内存
- C++ 中针对大型的堆栈分配
- 堆栈分配的向量如何在 C++ 中扩展