0

这是我用 C 语言完成的一个非常简单的程序,并且工作正常,但我不懂一些术语:

而不是list[list_size] = strdup(file)我这样做:

  1. char*test=filestrcpy(list[list_size],test)。我得到分段错误。

  2. char*test=malloc(sizeof(char)*MAX_FILENAME_LEN+1)test=filestrcpy(list[list_size],test)。我得到分段错误。

  3. 甚至strcpy(list[list_size],file)。我得到分段错误。

      # include < stdio.h > 
      # include < string.h > 
      # define MAX_LIST_SIZE 1000
      # define MAX_FILENAME_LEN 128
    
      int main() {
      FILE * infile;
      char * list[MAX_LIST_SIZE],
      file[MAX_FILENAME_LEN + 1];
      size_t list_size = 0;
      infile = popen("ls", "r");
    
      if (infile != NULL) {
    
          while ((list_size < MAX_LIST_SIZE) &&(fscanf(infile, "%s", file) == 1)) {
    
              list[list_size] = strdup(file);
    
              list_size++;
    
              puts(file);
          }
      }
      pclose(infile);
      return 0;
    

    }

如果有人可以提供帮助,那就太好了。

4

2 回答 2

2
char *list[MAX_LIST_SIZE];

在这里, 的元素list未初始化,它们不指向有效内存,因此您的程序会调用未定义的行为。strcpy()返回一个指针,该指针要么是要么NULL指向某个malloc()ated 内存,因此它是有效的。

于 2013-05-14T06:08:24.873 回答
2
  1. 非标准的 strdup 函数做了两件事:分配动态内存和复制字符串。这与调用 malloc 后调用 strcpy 完全相同(这就是为什么 strdup 是 100% 多余的函数)。

    当您这样做时strcpy(list[list_size],test), list 不会指向任何分配的内存 - 它指向内存中任何位置的随机内存位置。您尝试将数据复制到此随机位置并导致崩溃。

  2. 您分配内存并使用test. 然后,当您test指向内存时,您会忘记所有有关该内存的信息,file而是创建了内存泄漏。一旦你这样做了,你就会犯与 1 中相同的错误,因为变量test与.filelist

  3. 与 1 和 2 相同的错误。

我建议在深入研究动态内存分配和字符串处理之前多研究指针和数组。

于 2013-05-14T06:29:26.313 回答