如何在C中使用带双字符指针的realloc?
我试图在双字符指针中增加一行内存,但是由于某种原因程序崩溃了,尽管我没有收到任何警告。我在谷歌上搜索过,人们不断向realloc提供这种方式,但这对我不起作用。你知道陷阱在哪里吗?在最后一行 提前谢谢如何在C中使用带双字符指针的realloc?,c,pointers,dynamic,char,realloc,C,Pointers,Dynamic,Char,Realloc,我试图在双字符指针中增加一行内存,但是由于某种原因程序崩溃了,尽管我没有收到任何警告。我在谷歌上搜索过,人们不断向realloc提供这种方式,但这对我不起作用。你知道陷阱在哪里吗?在最后一行 提前谢谢 #include <stdio.h> #include <string.h> #include <stdlib.h> #define E 255 void Palindromas(char* Zodis, char eilute[E], int *kiekis
#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*));
}
}
#包括
#包括
#包括
#定义E 255
无效回文瘤(char*Zodis,char-eilute[E],int*kiekis,char**Ats);
int main()
{
char-Eilute[E];
int i,kiekis=-1;
字符**Ats;
char*Zodis;
Zodis=malloc(E*sizeof(char));
Ats=malloc(1*sizeof(char*);
//失意
文件*Duomenys=fopen(“Duomenys.txt”、“r”);
文件*Rezultatai=fopen(“Rezultatai.txt”,“w”);
//--------------------------------
如果(Ats==NULL)
{
printf(“Atmintis nebuvo paskirta”);
出口(0);
}
if(Zodis==NULL)
{
printf(“Atmintis nebuvo paskirta”);
出口(0);
}
如果(duomeys==NULL)printf(“Nurodyto duomenu failo nera\n”);
while(fgets(Eilute,sizeof(Eilute),duomeys))
{
回文瘤(Zodis、Eilute和kiekis、Ats);
}
因为(i=0;i我不得不用谷歌来理解你的代码,也许下次你可以帮我们翻译
我有几点看法:
if(duomeys==NULL)
只打印一条错误消息,但不停止执行。它应该与以前的验证一样(如果返回错误代码更好)
Ats[*kiekis]=malloc(ilgis*sizeof(char));
是错误的,它应该是Ats[*kiekis]=malloc((ilgis+1)*sizeof(char));
,因为它需要空结尾字符的空间
if(Zodis[j]!=Zodis[ilgis-j-1])index=0;
可以,但是如果(Zodis[j]!=Zodis[ilgis-j-1]){index=0;break;}
更好,因为这样循环将在第一个不同的字符处停止
if(index==1)strcpy(Ats[*kiekis],Zodis);
必须是if(index==1)strcpy(Ats[*kiekis],Zodis);否则--*kiekis
或者Ats
数组也不包含回文词Ats
数组中的每个元素,然后再使用类似for的东西释放数组本身(i=0;i在执行任何其他操作之前,您应该在C中搜索模拟按引用传递。您认为Ats
函数中的Palindromas
在分配给它时会发生什么情况?这将如何影响main
函数中的Ats
变量?进一步考虑您使用kiekis
所做的事情此外,您正在写入Ats[*kiekis]
,这在循环的第一次迭代中超出了范围。最后,不要重新分配回传递给realloc
的指针变量。如果realloc
失败,它将返回NULL
,并且您将丢失指针。并且始终检查错误(例如malloc
或realloc
返回NULL
).如果没有最后一行realloc,程序将准确打印我需要的内容…我只是从动态内存开始,所以我还是个新手…这就是为什么你总是用英语编写标识符的原因:在某个时候,你可能会有其他人阅读代码。如果你不使用英语,你几乎只能靠自己。谢谢你的帮助还有建议!我真的很感激。:)我已经修复了你在我发布主要问题时的所有观察结果,但是,当重新分配内存时,程序仍然崩溃……我用谷歌搜索了与你所说的完全相同的方法,我想使用它,但程序在启动时就崩溃了。:(我会尝试玩它,也许我会成功。Ats=realloc(Ats,(kiekis+1)*sizeof(char));它是Ats=realloc(Ats,(*kiekis+1)*sizeof(char));
*kiekis+1
而不是kiekis+1
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
}
}
}