1

char ポインターへの入力に関するテスト ケースを作成します。このプログラムを実行しようとすると、出力が正しくありません (: _ @$ のような一連のランダムな文字になります)。その char ポインターの各要素を出力するつもりです。コードにいくつかの変更を加えましたが、まだ間違っています (以前と同じ問題)。誰かが何が問題なのか、それを修正する方法を理解するのを手伝ってくれますか?

int chara;
int counts =0;

main(){

    char *buffer=(char *)malloc(sizeof(char)*25);
    while((chara=getchar())!= EOF&& counts<25){
        *buffer++ = chara;
        printf("%c\n",*buffer);
        counts++;

    }
    *buffer = '\0';
     printf("%s\n",buffer);
     free(buffer);
}
4

3 に答える 3

2

コードを変更します。

    int chara; //getchar() returns int
    int i=0;
    char *buffer=malloc(20); //allocate correctly
    while(  ( (chara=getchar())!= EOF) && ( i!=19 ) ) { //check against EOF and check counter value to avoid input with legth greater than allocated size.
        buffer[i]= chara;   
        //use indexing with counter variable to avoid errors with free()
        // if change pointer you can't free() memory  
         printf("%c\n",buffer[i++]);
    }

    buffer[i] = '\0';
     printf("%s\n",buffer);
     free(buffer);
于 2013-10-08T16:40:52.030 に答える
2

ループ内での値を大きくしているためbuffer、ループ後のコードが間違っています。によって返されていないアドレスを指すfree()インクリメントはできません。buffermalloc()

基本的にあなたがやっている:

char *buffer = malloc(25);
...
free(buffer + length of string the user entered);

これは、渡されたアドレスがfree()によって返されたものと同じでなくなったことを意味しmalloc()ます。これはエラーです。

于 2013-10-08T17:00:05.890 に答える
0

あなたの他の問題はこれです:

    *buffer++ = chara;
    printf("%c\n",*buffer);

ガベージを出力します - charawherebufferが指している場所に代入し、インクリメントしてから、現在指しbufferている (初期化されていない) 場所を出力bufferします。

chara代わりに印刷してください。

于 2013-10-08T17:20:51.177 に答える