1

文字列に文字を追加しようとしています...残念ながら、後で文字列のメモリを解放できません。そのため、文字列がどんどん長くなります。ファイルを読み取ると、すべてのリニーが明らかに発生してはならない文字列に追加されました

char* append_char(char* string, char character)
{
        int length = strlen(string);
        string[length] = character;
        string[length+1] = '\0';
        return string;
}

私は次のような文字列にmemを割り当てました

char *read_string = (char *)malloc(sizeof(char)*500);

関数を呼び出し、append_char(read_string,buffer[0]);文字列全体がビルドされた後に解放しますfree(read_string);

append_char()を呼び出すと、memの割り当てが変更されるため、それを取得できなくなると思います。

編集:これはappend_char()を使用する関数です

char *read_log_file_row(char *result,int t)
{
filepath ="//home/,,,,,/mmm.txt";
int max = sizeof(char)*2;
char buffer[max];
char *return_fgets;

char *read_string = malloc(sizeof(char)*500);

file_pointer = fopen(filepath,"r");

if(file_pointer == NULL)
{
    printf("Didn't work....");
    return NULL;
}   

int i = 0;

while(i<=t)
{
  while(return_fgets = (fgets(buffer, max, file_pointer)))
  {
    if(buffer[0] == '\n') 
    {
       ++i;
       break;   
    }   

        if(i==t)
    {
      append_char(read_string,buffer[0]);
     }      
   }

   if(return_fgets == NULL)
   {
      free(read_string);
      return NULL;                              
/*              return "\0";*/
        }
       if(buffer[0] != '\n') 
        append_char(read_string,buffer[0]);

   }    
   fclose(file_pointer);
    strcpy(result,read_string); 
    free(read_string);
   return result;
}
4

3 に答える 3

3
  1. の戻り値をmalloc()Cでキャストしないでください。
  2. read_stringを設定して、追加する前に、必ず空の文字列に初期化してくださいread_string[0] = '\0';
  3. バッファに収まらない文字列を作成しようとしないように、現在の長さを追跡するようにしてください。500文字が割り当てられるということは、文字列の最大長が499文字であることを意味します。

あなたがするときにあなたが期待することが起こるべきかわからないfree(read_string)。(あなたのコメントから@Steve Jessopの答えまで)あなたは次のようなことをしているようです:

char *read_string = malloc(500);
read_string[0] = '\0';  /* Let's assume you do this. */
append_char(read_string, 'a'); /* Or whatever, many of these. */
free(read_string);
print("%c\n", *read_string); /* This invokes UNDEFINED BEHAVIOR. */

これはを出力する可能性がありますが、これを行う( :dされたメモリにアクセスする)ことにより、プログラムが未定義の動作を呼び出しているため、何もa証明されません。つまり、何かが発生する可能性があります。「テスト」は有効ではないため、これから結論を引き出すことはできません。メモリを解放してからアクセスすることはできません。それを実行して、「合理的な」/「正しい」結果が得られたとしても、:ingが「機能しなかった」とは言えません。free()free()

于 2012-09-17T09:46:11.587 に答える
1

いいえ、メモリ割り当てはによって変更されませんappend_char。割り当ての内容を変更するだけです。nulターミネータを1バイト移動することで、以前よりも500バイトのうちの1つ多くの内容を気にするようになります。

文字列が500バイト(ターミネータを含む)より長くなる場合、未定義の動作があります。ヌル文字で終了する文字列ではないstrlenものを呼び出す場合、たとえば、から直接初期化されていないメモリへのポインタを渡す場合、未定義の動作が発生します。malloc

未定義の振る舞いは悪いです[*]:それを自由に読んでください、しかし「Xは未定義の振る舞いを持っています」は事実上「あなたはXをしてはいけない」という言い方です。

[*]正確には:悪くないことは保証されていません...

于 2012-09-17T09:41:32.397 に答える
0

文字列を初期化したことがありますか?*read_string=0割り当ててからお試しください。またはを使用しますcalloc。また、文字列は割り当てられたメモリを超えて成長しましたか?

于 2012-09-17T09:41:03.697 に答える