C 使用未初始化变量的问题
我有两个代码片段。两者都给了我一个关于使用未初始化变量的警告,然而,前者抛出了一个分段错误,而后者没有。请指出是什么导致了这里的差异 编辑:他们说这是未定义的行为。因此,为了清楚起见,我创建了一个未定义的char**qualified\u文件,那么在不为变量设置固定大小的情况下,如何处理这个文件呢 第一:C 使用未初始化变量的问题,c,C,我有两个代码片段。两者都给了我一个关于使用未初始化变量的警告,然而,前者抛出了一个分段错误,而后者没有。请指出是什么导致了这里的差异 编辑:他们说这是未定义的行为。因此,为了清楚起见,我创建了一个未定义的char**qualified\u文件,那么在不为变量设置固定大小的情况下,如何处理这个文件呢 第一: glob_t glob1; glob("*.log", GLOB_ERR, NULL, &glob1); char** file_name = glob1.gl_pathv; int
glob_t glob1;
glob("*.log", GLOB_ERR, NULL, &glob1);
char** file_name = glob1.gl_pathv;
int file_num = glob1.gl_pathc;
char** eligible_file;
int j = 0;
if (compare_string(argv[1], "-o")) {
for (int i = 0; i < file_num; i++) {
int rc = file_or(file_name[i], argv, 2, argc);
if (rc == 0) {
eligible_file[j] = file_name[i]; // the fault occurs here
j += 1;
}
}
} else {
for (int i = 0; i < file_num; i++) {
int rc = in_file(file_name[i], argv, 1, argc);
if (rc == 0) {
eligible_file[j] = "xasdax"; // the fault occurs here
j += 1;
}
}
}
glob\u t glob1;
glob(“*.log”、glob_ERR、NULL和glob1);
char**file\u name=glob1.gl\u pathv;
int file_num=glob1.gl_pathc;
字符**u文件;
int j=0;
if(比较字符串(argv[1],“-o”)){
对于(int i=0;i
后者:
char** fake;
char* me[] = {"qwedsa", "wqdxs", "qwdsx"};
if (1) {
for (int i = 0; i < 3; i++) {
fake[i] = me[i];
}
} else {
for (int i = 0; i < 3; i++) {
fake[i] = "wqxsaa";
}
}
char**false;
char*me[]={“qwedsa”、“wqdxs”、“qwdsx”};
如果(1){
对于(int i=0;i<3;i++){
假[我]=我[我];
}
}否则{
对于(int i=0;i<3;i++){
假[i]=“wqxsaa”;
}
}
在这两个代码段中,您都会写入指针,而不为指针分配内存
第一个片段:
char** eligible_file;
...
eligible_file[j] = file_name[i]; // the fault occurs here
j += 1;
及
第二段代码:
char** fake;
fake[i] = me[i];
...
fake[i] = "wqxsaa";
我几乎可以肯定,在所有情况下,当数组索引大于0时,即在未分配内存中写入时,都会出现错误
您应该以两种方式分配内存:
“未定义的行为”=无论发生什么,好的或坏的,不要问“为什么?”我不清楚你的问题是什么。你已经有了答案,即未初始化的变量。你很幸运!如果你观察到同样的行为,你会认为一切都(有点)正常,并试图摆脱警告。正如您在这里所问的,您会知道这两个片段都是错误的。两者都有未定义的行为。@pmg如果两者都有UB,那么为什么每次编译时第二个都能顺利工作?这很奇怪。“工作顺利”是“任何事情”的一个例子,未定义的行为意味着任何事情都可能发生。未定义的行为是未定义的。“看起来工作很好”是一个可能的结果。
char** fake;
fake[i] = me[i];
...
fake[i] = "wqxsaa";