我试图在双字符指针中将内存增加一行,但是由于某种原因,程序崩溃了,尽管我没有收到任何警告我在谷歌上搜索过,人们一直在提供这种重新定位的方式,但这对我不起作用你知不知道在哪里能抓到在最后一行。
提前谢谢!

#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/

10-12 22:54