Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用带双字符指针的realloc?_C_Pointers_Dynamic_Char_Realloc - Fatal编程技术网

如何在C中使用带双字符指针的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

我试图在双字符指针中增加一行内存,但是由于某种原因程序崩溃了,尽管我没有收到任何警告。我在谷歌上搜索过,人们不断向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*));
    }
}
#包括
#包括
#包括
#定义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
            } 
        }
    }