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