为什么在正常运行时此代码为什么会产生段错误,但是如果我添加命令行参数或注释掉调用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/

10-12 16:02