C 使用未初始化变量的问题

C 使用未初始化变量的问题,c,C,我有两个代码片段。两者都给了我一个关于使用未初始化变量的警告,然而,前者抛出了一个分段错误,而后者没有。请指出是什么导致了这里的差异 编辑:他们说这是未定义的行为。因此,为了清楚起见,我创建了一个未定义的char**qualified\u文件,那么在不为变量设置固定大小的情况下,如何处理这个文件呢 第一: glob_t glob1; glob("*.log", GLOB_ERR, NULL, &glob1); char** file_name = glob1.gl_pathv; int

我有两个代码片段。两者都给了我一个关于使用未初始化变量的警告,然而,前者抛出了一个分段错误,而后者没有。请指出是什么导致了这里的差异

编辑:他们说这是未定义的行为。因此,为了清楚起见,我创建了一个未定义的char**qualified\u文件,那么在不为变量设置固定大小的情况下,如何处理这个文件呢

第一:

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时,即在未分配内存中写入时,都会出现错误

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

  • 使用正确的数组而不是指针
  • 使用malloc()或其他类似函数分配(足够)内存


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

    我不清楚你的问题是什么。你已经有了答案,即未初始化的变量。你很幸运!如果你观察到同样的行为,你会认为一切都(有点)正常,并试图摆脱警告。正如您在这里所问的,您会知道这两个片段都是错误的。两者都有未定义的行为。@pmg如果两者都有UB,那么为什么每次编译时第二个都能顺利工作?这很奇怪。“工作顺利”是“任何事情”的一个例子,未定义的行为意味着任何事情都可能发生。未定义的行为是未定义的。“看起来工作很好”是一个可能的结果。
    char** fake;
    fake[i] = me[i];
    ...
    fake[i] = "wqxsaa";