使用未初始化变量的问题

时间:2019-06-03 10:21:36

标签: c

我有两个代码段。两者都给我有关使用未初始化变量的警告,但是,前者引发了分段错误,而后者却没有。请在此处指出导致差异的原因。

编辑:他们说这是不确定的行为。因此,要清楚一点,我创建了一个未定义的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";
  }
}

1 个答案:

答案 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时(即发生在未分配内存中的写入操作时),都会出现错误。

您应该通过以下两种方式分配内存:

  1. 使用适当的数组代替指针;
  2. 使用malloc()或其他类似函数来分配(足够)内存。

“不确定的行为” =无论发生什么,好事或坏事,不要问“为什么?”