我有两个代码段。两者都给我有关使用未初始化变量的警告,但是,前者引发了分段错误,而后者却没有。请在此处指出导致差异的原因。
编辑:他们说这是不确定的行为。因此,要清楚一点,我创建了一个未定义的char ** eligible_file,那么如何在不设置变量固定大小的情况下解决这个问题?
第一个:
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;
}
}
}
后者:
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";
}
}
答案 0 :(得分:0)
在两个代码段中,您都写入了一个指针,但没有为其分配内存。
第一段:
char** eligible_file;
...
eligible_file[j] = file_name[i]; // the fault occurs here
j += 1;
和
char** eligible_file;
...
eligible_file[j] = "xasdax"; // the fault occurs here
j += 1;
第二个片段:
char** fake;
fake[i] = me[i];
...
fake[i] = "wqxsaa";
我几乎可以肯定,在所有情况下,当数组索引大于0时(即发生在未分配内存中的写入操作时),都会出现错误。
您应该通过以下两种方式分配内存:
“不确定的行为” =无论发生什么,好事或坏事,不要问“为什么?”