我正在为大学开展c ++项目,我在以下代码中遇到了未初始化指针的问题:
#include <iostream>
using namespace std;
struct t_coord {
double valeur;
int indice;
t_coord *suiv;
};
struct t_vecteur {
int dimension;
double defaut;
t_coord *tete;
};
void initialiser (t_vecteur tv, int dimension, double defaut) {
tv.dimension = dimension;
tv.defaut = defaut;
tv.tete = nullptr;
}
int main () {
t_vecteur tv;
initialiser(tv, 5, 3.14);
return 0;
}
无论如何都要在VisualStudio中覆盖c4700错误,这样我就可以使用我的初始化函数&#34; initialiser()&#34; ?最终的编译将在GNU上完成,它没有考虑未初始化的变量,并且在项目中指定我必须创建一个函数来初始化我的t_vecteur。
提前致谢
答案 0 :(得分:1)
结构%run "DESeq2 Analysis.ipynb"
是aggregate,因此实例t_vecteur
未初始化(tv
,dimension
和defaut
,作为原始数据类型,包含不确定的数据。)
然后将 by-value 传递给函数tete
,在创建副本时从initialiser
读取,从而调用未定义的行为
该标准的相关短语位于[dcl.init]/12:
当获取具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,并且如果没有对该对象执行初始化,则该对象将保留不确定的值,直到该值被替换为
如果评估产生不确定的值,则行为未定义
要解决此问题(以及C4700未初始化的变量警告),请将tv
传递给tv
by-reference 。
initialiser
传递引用不是从void initialiser (t_vecteur& tv, int dimension, double defaut) {
读取,因此不再是UB。