C编程,需要帮助理解一些概念

时间:2013-05-14 06:04:04

标签: c terminology

这是一个非常简单的程序,我在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 个答案:

答案 0 :(得分:2)

char *list[MAX_LIST_SIZE];

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

答案 1 :(得分:2)

  1. 非标准strdup函数做两件事:它分配动态内存并复制字符串。这与调用malloc然后调用strcpy是完全相同的(这就是为什么strdup是一个100%多余的函数)。

    执行strcpy(list[list_size],test)时,list不指向任何已分配的内存 - 它指向内存中任意位置的随机内存位置。您尝试将数据复制到此随机位置并发生崩溃。

  2. 您使用test分配内存并指向它。当你让test指向file时,你忘记了所有关于那个记忆的内容,你创造了一个内存泄漏。一旦你完成了这个,就会出现与1中相同的错误,因为变量testfilelist无关。

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

  4. 在深入研究动态内存分配和字符串处理之前,我建议稍微研究一下指针和数组。