0

次のコードでは、最後の for ループの後もクラッシュし続けています。Netbeans でデバッグしてもわかりません。 for ループが機能し、出力したいものを出力しますが、正常に終了する代わりにプログラムがクラッシュします。助けていただけますか (gets については知っています。すぐに fgets を試してみます)??

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
    char *str,**string,buffer[50],temp[2];
    int i,j,size,counter;
    size=1;

    string=(char**) calloc(size,sizeof(char*));
    for (i=0; i<size; i++) string[i]=(char*)malloc(50*sizeof(char));

    printf("\nGimme strings, terminate input with x");
    i=0;
    gets(string[i]);
    temp[0]=120;//x
    temp[1]='\0';
    size=2;
    while(strcmp(string[i],temp)!=0)
    {
        string=realloc(string,size*sizeof(char**));
        i++;
        string[i]=malloc(50*sizeof(char));
        gets(string[i]);
        size++;
        counter++;
    }
    for(i=0; i<=counter; i++) printf("\n%s",string[i]);
    return 0;
}
4

2 に答える 2

1

counterwhileループの前に 0 に初期化されていません

そして使う

string=realloc(string,size*sizeof(char*));

それ以外の

string=realloc(string,size*sizeof(char**));

realloc(string,2*sizeof(char**));コードでポインターの配列を割り当ててから、配列内の各ポインターにメモリを割り当ててから、配列のほとんどを削除すると、配列のほとんどが削除され、配列のみが保持されるため、何をしようとしているのかを詳細に説明できますか 最初の 2 つのポインター。したがって、これにより、割り当てられたメモリへのポインターが失われるため、それらを解放できなくなります。

于 2013-01-09T14:32:54.397 に答える
0
  1. whileサイクルの前に、カウンタをゼロに設定する必要があります。デフォルトではゼロに設定されていません。

  2. for lookのサイクルでは、以下を除外する必要がありますcounter

    for(i=0; i<counter; i++) printf("\n%s",string[i]);

  3. を呼び出して、動的に割り当てられたすべてのメモリを解放しますfree

于 2013-01-09T14:34:14.940 に答える