【发布时间】:2017-05-08 21:03:07
【问题描述】:
这是如何工作的?在编写这个函数时,我忘记包含return 声明:
char *getV(const char *var) {
char *val = nullptr;
forward_list<formField>::iterator idx;
formField ffld;
idx = _fields.begin();
while (idx != _fields.end()) {
ffld = *idx;
if (strcmp(ffld.Name, var) == 0) {
val = ffld.Val;
break;
}
idx++;
}
}
这里是formField:
struct formField {
char *Name = nullptr;
char *Val = nullptr;
};
这是我调用函数的方式:
int main () {
form fdata;
fdata.add("FirstName", "Alan");
char *fval = fdata.getV("FirstName");
if (fval != nullptr) cout << fval;
else cout << "not found";
cout << "\n";
}
直到后来,在测试了函数并编写了使用它的其他代码之后,我才注意到缺少的return。该函数应该返回*val...确实如此!怎么样?
【问题讨论】:
-
未定义行为的永无止境的魔力。
-
未定义的行为。 anything 是编译器允许的;你所期望的,没有,崩溃,格式化你的硬盘。您的代码格式不正确,没有任何意义。不,当您参与 UB 时,编译器不需要给您错误或警告。 你有责任“不要那样做”。
-
...洗碗,给莫斯科的随机号码拨打淫秽电话...好吧,很有趣。谢谢。
-
@JesperJuhl 我明白了。这不是我故意做的,也不是打算按原样保留(除非结果涉及一些我不知道的明确行为)。
-
@TheTechel 这是一个有用的结构。谢谢。
标签: c++