私は二重のcharポインタで1行だけメモリを増やそうとしていますが、何らかの理由でプログラムがクラッシュします。私はgoogledと人々reallocにこの方法を提供し続けますが、それは私のために動作しません。あなたはキャッチがどこにあるか知っていますか?最後の行にあります。Cでdouble charポインタを使ったreallocの使い方は?
ありがとうございます!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define E 255
void Palindromas(char* Zodis, char eilute[E], int *kiekis, char** Ats);
int main()
{
char Eilute [E];
int i, kiekis = -1;
char** Ats;
char* Zodis;
Zodis = malloc(E * sizeof(char));
Ats = malloc(1 * sizeof(char*));
// Failu aprasymas
FILE *Duomenys = fopen("Duomenys.txt", "r");
FILE *Rezultatai = fopen("Rezultatai.txt","w");
//--------------------------------
if (Ats == NULL)
{
printf("Atmintis nebuvo paskirta");
exit(0);
}
if (Zodis == NULL)
{
printf("Atmintis nebuvo paskirta");
exit(0);
}
if (Duomenys == NULL) printf("Nurodyto duomenu failo nera \n");
while(fgets(Eilute, sizeof(Eilute), Duomenys))
{
Palindromas(Zodis, Eilute, &kiekis, Ats);
}
for (i = 0; i <= kiekis; i++)
{
fprintf(Rezultatai, "%s ", Ats[i]);
}
free(Ats);
free(Zodis);
fclose(Duomenys);
fclose(Rezultatai);
return 0;
}
void Palindromas(char* Zodis, char Eilute[E], int *kiekis, char** Ats)
{
int i, l, j, index, ilgis, eil;
for(i = 0; 1 == sscanf(Eilute + i, "%s%n", Zodis, &l); i = i + l)
{
*kiekis = *kiekis + 1;
index = 1;
ilgis = strlen(Zodis);
Ats[*kiekis] = malloc(ilgis * sizeof(char));
for (j = 0; j < ilgis; j++)
{
if (Zodis[j] != Zodis[ilgis - j - 1])
index = 0;
}
if (index == 1) strcpy(Ats[*kiekis], Zodis);
eil = *kiekis + 2;
Ats = realloc(Ats, eil * sizeof(char*));
}
}
C *で参照渡しをエミュレートする*。あなたがそれを割り当てるとき、パインドロマス機能の 'Ats'はどうなると思いますか?それは 'main'関数の' Ats'変数にどのように影響しますか? 'キエキス 'で何をしているのか考えてみてください。 –
さらに、ループの最初の反復で* out of bounds *である 'Ats [* kiekis]'に書き込んでいます。 –
最後に、 'realloc'に渡すポインタ変数に再割り当てしないでください。 'realloc'が失敗すると' NULL'を返し、ポインタを失います。 *常に*エラーをチェックする( 'malloc'や' realloc'が 'NULL'を返すなど)。 –