如何在C中使用带有双字符指针的realloc?

时间:2016-11-23 09:32:56

标签: c pointers dynamic char realloc

我试图在双字符指针中增加一行内存,但由于某种原因程序崩溃,即使我没有收到任何警告。我用谷歌搜索,人们继续提供这种方式来重新分配,但它并不适合我。你知道捕获的地方吗?它在最后一行。

提前致谢!

#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*));
    }
}

1 个答案:

答案 0 :(得分:0)

我必须使用谷歌来理解你的代码,也许下次你可以为我们翻译它。

我有一些意见:

  • 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
        } 
    }
}