为什么在正常运行时此代码为什么会产生段错误,但是如果我添加命令行参数或注释掉调用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]==nullptr
。然后cpy(argv[1])
是cpy(nullptr)
,并且cpy调用strncpy(x,nullptr,8)
和segfaults。
如果您注释掉了cpy,则不会出现段错误。
如果您传递参数,则cpy不会出现段错误。但是然后您遇到另一个问题:fn是p=n
,但是n是在堆栈上声明的,所以回到main在cout<<p[0]
时,p指向不再存在的对象n,因此行为是不确定的。
关于c++ - 指针段错误与未定义行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40570532/