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
  1. 非標準の strdup 関数は、動的メモリの割り当てと文字列のコピーという 2 つのことを行います。これは、malloc を呼び出した後に strcpy を呼び出すのとまったく同じことです (これが、strdup が 100% 余分な関数である理由です)。

    を行うstrcpy(list[list_size],test)と、リストは割り当てられたメモリを指していません-メモリ内の任意の場所のランダムなメモリ位置を指しています。このランダムな場所にデータをコピーしようとすると、クラッシュが発生します。

  2. メモリを割り当て、 でポイントしtestます。test次に、代わりにポイントしたときにそのメモリのことをすべて忘れてしまいfile、メモリ リークが発生します。そして、一度それを行うと、変数testfilelist.

  3. 1と2と同じバグ。

動的メモリ割り当てと文字列処理に飛び込む前に、ポインターと配列をもう少し勉強することをお勧めします。

于 2013-05-14T06:29:26.313 に答える
2
char *list[MAX_LIST_SIZE];

ここでは、 の要素listが初期化されておらず、有効なメモリを指していないため、プログラムは未定義の動作を呼び出します。結果的に有効なメモリを指すstrcpy()かポインタを返します。NULLmalloc()

于 2013-05-14T06:08:24.873 に答える