我试图在双字符指针中将内存增加一行,但是由于某种原因,程序崩溃了,尽管我没有收到任何警告我在谷歌上搜索过,人们一直在提供这种重新定位的方式,但这对我不起作用你知不知道在哪里能抓到在最后一行。
提前谢谢!
#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*));
}
}
最佳答案
我不得不用谷歌来理解你的代码,也许下次你可以帮我们翻译。
我有几点看法:if (Duomenys == NULL)
只需打印错误消息,但不会停止执行它应该类似于以前的验证(如果返回错误代码更好)。Ats[*kiekis] = malloc(ilgis * sizeof(char));
是错误的,它应该是Ats[*kiekis] = malloc((ilgis+1) * sizeof(char));
因为它需要空结束字符的空间。if (Zodis[j] != Zodis[ilgis - j - 1]) index = 0;
很好,但最好是if (Zodis[j] != Zodis[ilgis - j - 1]) { index = 0; break; }
,因为这样循环将在第一个不同的字符处停止。if (index == 1) strcpy(Ats[*kiekis], Zodis);
必须if (index == 1) strcpy(Ats[*kiekis], Zodis);else --*kiekis
否则Ats
数组也将包含非回文单词。
在用类似于Ats
的东西释放数组本身之前,不要忘记释放for(i=0; i<=kiekis; i++) free(Ats[i]);
数组的每个元素
最后,回答您的问题,要重新分配Ats
数组,请执行以下操作:
Ats = realloc(Ats, (*kiekis+1) * sizeof(char*));
我会这样重组你的职能:
void Palindromas(char* Zodis, char Eilute[E], int *kiekis, char** Ats)
{
int i, l, j, index, ilgis;
for(i = 0; 1 == sscanf(Eilute + i, "%s%n", Zodis, &l); i = i + l)
{
index = 1;
ilgis = strlen(Zodis);
for (j = 0; j < ilgis; j++)
{
if (Zodis[j] != Zodis[ilgis - j - 1])
{
index = 0;
break;
}
}
if (index == 1)
{
++*kiekis;
Ats = (char **)realloc(Ats, (*kiekis+1) * sizeof(char*));
Ats[*kiekis] = dup(Zodis); // dup == malloc+strcopy
}
}
}
关于c - 如何在C中使用带有双字符指针的realloc?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40760578/