c++ - 指针段错误与未定义行为

标签 c++ segmentation-fault undefined-behavior buffer-overflow

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

相关文章:

c++ - 代码的有效性

c++ - 为什么代码会通过空指针显式调用静态方法?

c++ - 获取设备 IMEI BB10 C++/QML

linux - 内核 panic - 不同步。初始化段错误

c - 简单偏移加密中的段错误

c - 循环中的execl和wget命令

c++ - "this"GDB 回溯中的指针变化

c++ - 使用正确的编译器标志在每个平台上进行相同的模拟

C# 设计选择——COM 对象还是另一个类?

c++ - 永远不会终止的程序是有效的 C++ 程序吗?