为什么此代码在定期运行时产生段错误,但未定义的行为而不是段错误,如果我添加命令行参数或注释掉调用cpy
函数?指针段错误与未定义的行为
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int *p;
void fn() {
int n[1];
n[0]=99;
p = n;
}
void cpy(char *v) {
char x[8];
strncpy(x,v,8);
}
int main(int argc, char** argv) {
fn();
cpy(argv[1]);
cout << "p[0]:" << p[0];
}
我知道n
是功能fn
一个局部变量,但有一个方法可以让我缓冲区溢出或输入的东西如argv[1]
得到它的打印值不管它是举行n
/是在记忆中?
未定义的行为?如果添加命令行参数,它将存储在argv [1]中。如果你注释掉了cpy()行,那么你并没有在任何地方使用argv [1],这就是导致段错误的原因。 – Matt
但为什么不使用'argv [1]'会导致段错误?我的意思是未定义的行为,打印指向超出范围变量的'p'的索引。 – Austin
等待,因为不提供cmdline参数,或不使用变量argv [1]? – Matt