0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Exploded {
    char ** tokens;
    int rows;
    int cols;
};

void resetExploded(struct Exploded *exploded)
{
    int i;
    for(i = 0; i < exploded->rows; i++)
    {
        if(exploded->tokens[i] != NULL) {
            free(exploded->tokens[i]);
            exploded->tokens[i] = NULL;
        }
    }

    free(exploded->tokens);

    exploded->tokens = NULL;
    exploded->rows = 0;
    exploded->cols = 0;
}


void explode(char *str, char delim, struct Exploded *exploded)
{
    resetExploded(exploded);
    int i;
    char str_delim[2];
    char *ptr;
    str_delim[0] = delim;
    str_delim[1] = 0; 

    for(i = 0; i < strlen(str); i++)
    {
        if(str[i] == delim)
            exploded->rows++;
    }

    exploded->rows++;

    exploded->tokens = malloc(exploded->rows * sizeof(char *));

    if(exploded->tokens == NULL) {
        perror("more details"); 
        return;
    }

    i = 0;
    ptr = strtok(str, str_delim);
    while(ptr != NULL)
    {
        if(exploded->cols < strlen(ptr) + 1)
        {
            exploded->cols = strlen(ptr) + 1;
        }
        exploded->tokens[i] = malloc(exploded->cols * sizeof(char));
        if(exploded->tokens[i] == NULL) {
            perror("more details");
            return;
        }
        exploded->tokens[i] = ptr;
        i++;
        ptr = strtok(NULL, str_delim); 
    }
}


int main()
{
    struct Exploded exploded = { NULL, 0, 0 };
    char str[] = "I was handling this nicely";
    explode(str, ' ', &exploded);
    int i = 0;
    printf("rows: %d, cols: %d\n", exploded.rows, exploded.cols);
    for(i = 0; i < exploded.rows; i++)
    {
        printf("here %d: %s\n", i, exploded.tokens[i]);
    }

    char str2[] = "I have no ideea what the heck is wrong";
    explode(str2, ' ', &exploded);
    i = 0;
    printf("rows: %d, cols: %d\n", exploded.rows, exploded.cols);
    for(i = 0; i < exploded.rows; i++)
    {
        printf("here %d: %s\n", i, exploded.tokens[i]);
    }

    return 0;
}

I am struggling with this for 2 days now. Memory is allocated from heap and should be freed but my compiler is saying that i am doing something wrong. Can anyone please explain why this crashes? It crashes on Windows 7 and on MX Linux 32bits, not sure... but I ran this code on windows 10 inside a bigger program and didn`t have this crash. On windows 7 i have mingw 8.1 i think and MX linux has gcc 6.3. I have this report from linux:

$ ./explode
rows: 5, cols: 9
here 0: I
here 1: was
here 2: handling
here 3: this
here 4: nicely
*** Error in `./explode': munmap_chunk(): invalid pointer: 0xbfbce665 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6738a)[0xb7d8338a]
/lib/i386-linux-gnu/libc.so.6(+0x6dfc7)[0xb7d89fc7]
/lib/i386-linux-gnu/libc.so.6(+0x6e6c1)[0xb7d8a6c1]
./explode(+0x6d6)[0x41e6d6]
./explode(+0x753)[0x41e753]
./explode(main+0x12f)[0x41e9f9]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf6)[0xb7d34286]
./explode(+0x551)[0x41e551]
======= Memory map: ========
0041e000-0041f000 r-xp 00000000 07:01 9302       /home/demo/Documents/explode
0041f000-00420000 r--p 00000000 07:01 9302       /home/demo/Documents/explode
00420000-00421000 rw-p 00001000 07:01 9302       /home/demo/Documents/explode
00483000-004a4000 rw-p 00000000 00:00 0          [heap]
b7ce6000-b7d02000 r-xp 00000000 07:00 5649       /lib/i386-linux-gnu/libgcc_s.so.1
b7d02000-b7d03000 r--p 0001b000 07:00 5649       /lib/i386-linux-gnu/libgcc_s.so.1
b7d03000-b7d04000 rw-p 0001c000 07:00 5649       /lib/i386-linux-gnu/libgcc_s.so.1
b7d1c000-b7ecd000 r-xp 00000000 07:00 5616       /lib/i386-linux-gnu/libc-2.24.so
b7ecd000-b7ecf000 r--p 001b0000 07:00 5616       /lib/i386-linux-gnu/libc-2.24.so
b7ecf000-b7ed0000 rw-p 001b2000 07:00 5616       /lib/i386-linux-gnu/libc-2.24.so
b7ed0000-b7ed3000 rw-p 00000000 00:00 0 
b7eea000-b7eee000 rw-p 00000000 00:00 0 
b7eee000-b7ef1000 r--p 00000000 00:00 0          [vvar]
b7ef1000-b7ef3000 r-xp 00000000 00:00 0          [vdso]
b7ef3000-b7f16000 r-xp 00000000 07:00 5592       /lib/i386-linux-gnu/ld-2.24.so
b7f16000-b7f17000 r--p 00022000 07:00 5592       /lib/i386-linux-gnu/ld-2.24.so
b7f17000-b7f18000 rw-p 00023000 07:00 5592       /lib/i386-linux-gnu/ld-2.24.so
bfbb0000-bfbd1000 rw-p 00000000 00:00 0          [stack]
Aborted

Lenny1986
  • 1
  • 2

0 Answers0