0

次のコードでは、ユーザーにいくつかの文字列を提供するように求めています。長さ 50 の文字列の先頭を指すポインタ文字列で入力を読み取るように、2 次元のポインタ char 配列を作成します。私の問題は、最初の文字列の入力後にクラッシュし続けることです。私の問題は再割り当てに関係しています。私はそれに慣れていません..何が起こっているのかを理解するのを手伝ってもらえますか?? netbeans でデバッグしようとしましたが、realloc から作成された新しいアドレスに対するフィードバックが得られないため、興味深いものを見つけることができませんでした!!

コードは次のとおりです。

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

int main()
{
    char *str,**string,buffer[50],temp[2];
    int i,j,q,size,counter;
    size=10;
    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=0;
    while(strcmp(string[i],temp)!=0)
    {
        string=realloc(string,size*sizeof(char**));
        i++;
        gets(string[i]);
        size++;
        counter++;
    }
return 0;
}

この realloc でポインターのテーブルを大きくしたい。

4

3 に答える 3

4
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;

を呼び出した後reallocstring新しい部分には有効なポインターが含まれていません。したがって、 を呼び出すとgets、初期化に失敗したポインターが渡されます。

また、それsize=0;は完全に壊れています。

于 2013-01-09T13:52:31.077 に答える
2

realloc は、割り当てられたメモリをゼロで初期化しません。さらに、新しく割り当てられた文字列ポインターを初期化するのを忘れました。

while ループ内を上i++に移動することを検討してください。size++

于 2013-01-09T13:50:20.743 に答える
0

コードレビュー

すべての変数を初期化します

  char *str = NULL,**string = NULL,buffer[50] = {0},temp[2] = {0};
  int i = 0,j = 0,q = 0,size = 10,counter = 0;

返されたものをキャストせずmalloc/calloc、明確にするために可能な場合は {} を使用します

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

キーボードから読み込む場合は を使用せず、読み込む最大サイズを指定できるので をgets使用します。fgets()

printf("\nGimme strings, terminate input with x");
char input[256];
fgets(input,sizeof(input),stdin); // another varname, will explain below

新しいコンパイラでは、関数の先頭で宣言する代わりに、必要な場所で変数を宣言できます。

char temp={'x','\0'}; // 120;//x

ここで size=0 を設定するのは少し奇妙に思えます

size=0;

ユーザーが入力したものを別のバッファ(入力)に保持し、「x」でない場合は文字列配列にコピーすることをお勧めします。

while(strcmp(string[i],temp)!=0)
{
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;
    counter++;
}

例えば

while (fgets(input,sizeof(input),stdin) != NULL && input[0] != 'x')
{
   string[i] = calloc(1,strlen(input)+1); // add a byte for \0
   strncpy(string[i],input,strlen(input)-1); // not copying ending \n
   if ( ++i == size ) // a new chunk needed
   {
     char *newstring = realloc((size + 10)*sizeof(char*), string );
     if ( newstring != NULL )
     {
       string = newstring;
       size += 10;
     }
   }
}
于 2013-01-09T14:27:19.477 に答える