TransWikia.com

Почему происходит вылет при realloc?

Stack Overflow на русском Asked by mankey_yeeman on December 30, 2021

мне надо пройтись по текстовому файлу, где строки разделены пробелом, и раскидать их в массив. Функция getKeyWord должна сама выделить память и присвоить указателю новый адрес памяти где хранится строка. Она возвращает 1, если прочитала последнее слово в файле, иначе 0.

Компилятор: GNU GCC 9.2.0.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

char getKeyWord(FILE *f, char **str);
int main(int argc,char *args[])
{
        if (argc!=3)
        {
            printf("error");
            return 0;
        }
        FILE *orig_file;
        if ( !(orig_file = fopen(args[1], "r")) )
        {
            printf("1st path is invalid ");
            return 0;
        }

    size_t count_str = 0, size_buf = 10, step =10;
    char **strings = malloc(sizeof(char*)*size_buf);

    while(1)
    {

        if(getKeyWord(orig_file, strings+count_str))
        {
            printf("%i %snEND",count_str, strings[count_str]);
            break;
        }
        printf("%i %snn",count_str+1, strings[count_str]);


        if (++count_str >= size_buf)
        {
            size_buf += step;
            strings = realloc(strings, size_buf);
        }
    }
    return 0;
}
char getKeyWord(FILE* f, char **str)
{
    int c;
    size_t  count_chars = 0, step =10,size_buf = step;
    *str = (char*)malloc(sizeof(char)*size_buf);


    while(1)
    {

        c=fgetc(f);

        putchar(c);
        if (c==' ')
        {
            *(*str+count_chars) = 0;
            putchar('n');
            return 0;
        }

        if (c==EOF)
        {
            *(*str+count_chars) = 0;
            putchar('n');
            return 1;
        }
        *(*str+count_chars) = c;
        if (++count_chars >= size_buf)
        {
            size_buf += step;
            *str = realloc(*str,size_buf);
            
        }
    }

    return 0;
}

пример такого файла:

strings string name category text xml version dialog gfx offset size halign valign font button image center left right std hover down color credits speed format align indent space pause time file sfx frame progressbar direction vertical horizontal back front range min max steps caption hover_down disabled top resizedialog animation bottom mid all_objects object type loop oneshot chili right closeddoorback position ms inv closeddoorleft closeddoorright dog region neighbor doorback doorleft doorright woody gfxdata icon actor hotspot start noise action actoranim actornextanim objanim objnextanim auto ms0 ms1 ms2 ms3 volume triggers behavior triggers always once house room level angrytime layer room path1 path2 floor door wall true false costs doorin doorout tricks trick quota1 quota2 quota3 quota4 combination remove ingredient splasher splasher splasher statusbar hide with description wrong nearobj trigger inventar singleuse stdaction open look hideout locale charset install fonts bold slanted leveldata set state playable reachable minquota nextset locked shortcuts key code shortcut function

One Answer

Спасибо @Ainar-G, я тут забыл, когда заново выделял память массива, умножить размер массива на размер указателя.

Answered by mankey_yeeman on December 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP