【问题标题】:C programming , need help understanding some conceptC编程,需要帮助理解一些概念
【发布时间】:2013-05-08 07:41:40
【问题描述】:

这是我用 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;
    

    }

如果有人能帮忙就好了。

【问题讨论】:

标签: c terminology


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

    当您执行strcpy(list[list_size],test) 时,list 并没有指向任何已分配的内存——它指向的是内存中任意位置的随机内存位置。您尝试将数据复制到此随机位置并导致崩溃。

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

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

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

【讨论】:

  • 谢谢,很好的回答;所以字符数组实际上是指针......谢谢,刚刚学到了一些新东西。
  • @user2341716 不!字符数组是字符数组。 (如果您使用不带 [] 的数组名称,您将获得一个指向第一个元素的指针。)但是:char * list[MAX_LIST_SIZE] 是一个指向字符的指针数组
【解决方案2】:
char *list[MAX_LIST_SIZE];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多