Ich versuche, den Speicher um eine Zeile in Double Char Zeiger zu erhöhen, aber aus irgendeinem Grund stürzt das Programm ab, obwohl ich keine Warnungen bekomme. Ich habe gegoogelt und die Leute bieten immer wieder diesen Weg an, aber es funktioniert nicht für mich. Weißt du, wo ist der Haken? Es ist in der letzten Zeile.Wie Realloc mit Double Char Zeiger in C verwenden?
Vielen Dank im Voraus!
#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*));
}
}
Bevor Sie etwas anderes tun, sollten Sie suchen for * emulieren Pass durch Referenz in C *. Was glaubst du passiert mit "Ats" in der "Palindromas" -Funktion, wenn du es zugewiesen hast? Wie wirkt sich das auf die 'Ats'-Variable in der' main'-Funktion aus? Denken Sie darüber nach, was Sie mit 'kiekis' machen. –
Darüber hinaus schreiben Sie in der allerersten Iteration der Schleife zu 'Ats [* kiekis]', das * außerhalb der Grenzen liegt *. –
Zuletzt, weisen Sie die Zeigervariable, die Sie an 'realloc' übergeben, nicht erneut zu. Wenn 'realloc' fehlschlägt, wird' NULL' zurückgegeben und Sie verlieren den Zeiger. Und * immer * nach Fehlern suchen (z. B. 'malloc' oder' realloc', die 'NULL' zurückgeben). –