1
"done"という単語が導入されるまでいくつかの単語を読んでいます。これらの単語は動的に割り当てられた行列に入れられ、受け取られた各入力で修正されます。 問題は、3ワード後にプログラムがクラッシュし、警告として「メモリ割り当てに失敗しました」というメッセージが表示されることです。 私の再割り当てには何が問題なのですか?アレイの再割り当てが失敗する
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_DIM 100
int main()
{
char **words,buff[100];
int i,dim = 0;
words = (char**)calloc(dim,dim*sizeof(char*));
while(strcmp(buff,"done"))
{
printf("the new word : ");
scanf("%100s", buff);
if(strcmp(buff,"done"))
{
dim++;
words = (char**)realloc(words,dim*sizeof(char*));
if(words == NULL)
{
printf("Memory allocation failed !\n");
exit(0);
}
words[dim] = (char*)calloc(MAX_DIM,sizeof(char));
strcpy(words[dim],buff);
}
}
printf("%d", dim);
for (i = 0;i < dim;i++)
free(words[i]);
free(words);
return 0;
}
いいえいいえに
からあなたのコードの最後の部分を補正することにより解決することができます!インデックスは0からn-1までですので、 'words [dim]'は範囲外です! –
この 'scanf("%100s "、buff);は' scanf( "%99s"、buff); 'でなければなりません。 Cの "文字列"は ''終止符を保存するために '' char '"を必要とします。または、これを回す:C "文字列"は '0'終端子を格納するために' char'を必要とするので、 'char'はそれほど割り当てられません。 – alk
また、 'sizeof(char)'はdefintionによって '1'と等しくなります。 – alk