【发布时间】:2017-04-07 05:35:56
【问题描述】:
我试图在双字符指针中将内存增加一行,但由于某种原因程序崩溃了,即使我没有收到任何警告。我用谷歌搜索过,人们一直在提供这种方式来重新分配,但它对我不起作用。你知道问题在哪里吗?它在最后一行。
提前致谢!
#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*));
}
}
【问题讨论】:
-
在你做任何其他事情之前,你应该搜索emulating pass by reference in C。当您分配给
Palindromas函数时,您认为Ats会发生什么?这将如何影响main函数中的Ats变量?想想你在用kiekis做什么。 -
此外,您正在写信给
Ats[*kiekis],这在循环的第一次迭代中超出范围。 -
最后,不要重新分配回您传递给
realloc的指针变量。如果realloc失败,它将返回NULL并且您会丢失指针。并且总是检查错误(例如malloc或realloc返回NULL)。 -
没有最后一行 realloc 程序会打印出我需要的内容...我只是从动态内存开始,所以我还是个新手...
-
这就是为什么你总是用英文写标识符的原因:你可能在某个时候让其他人阅读代码。如果您不使用英语,那么您几乎是靠自己的。
标签: c pointers dynamic char realloc