爲什麼此代碼在定期運行時產生段錯誤,但未定義的行爲而不是段錯誤,如果我添加命令行參數或註釋掉調用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