освобождение подстроки в цикле c - PullRequest
2 голосов
/ 06 июля 2010

Я пытаюсь получить подстроку для каждого члена структуры 'structs', а затем назначить эту подстроку новому члену temp_struct.У меня проблема в том, как освободить подстроку на каждой итерации, по какой-то причине код выполняется, однако valgrind выдает Invalid read of size 1, что, я полагаю, я считываю из блока памяти.*

Как мне освободить подстроку?

Спасибо

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

struct st_ex {
    char product[16];
    float price;
};
struct st_temp {
    char *prod;
};

char *temp = NULL;

// from stackoverflow
char* substr( const char* source, size_t start, size_t end )
{
    char* dest = malloc( end - start + 1) ;
    memcpy( dest, &source[start], end - start ) ;
    dest[end - start] = 0 ;
    return dest ;
}

int main()
{
    struct st_ex structs[] = {{"mp3 player", 2.0f}, {"plasma tv", 20.0f},
                              {"notebook", 10.0f},  {"smartphone", 49.9f},
                              {"dvd player", 10.0f}, {"matches", 0.2f }};
    struct st_temp **temp_struct;

    size_t j, i;
    temp_struct = malloc(sizeof *temp_struct * 6);
    for (j = 0; j < 6; j++)
        temp_struct[j] = malloc(sizeof *temp_struct[j]);

    size_t structs_len = sizeof(structs) / sizeof(struct st_ex);

    for(i=0; i<structs_len; i++){
        temp = substr(structs[i].product, 0, 4);
        temp_struct[i]->prod = temp;
        free(temp);
        temp = NULL;
    }
    for(i=0; i<6; i++ )
        printf("%s\n",temp_struct[i]->prod);

    for(i=0; i<6; i++ )
        free(temp_struct[i]);

    free(temp_struct);
    return 0;
}

Ответы [ 3 ]

1 голос
/ 06 июля 2010

1) Вы освобождаете подстроку

    temp = substr(structs[i].product, 0, 4); 
    temp_struct[i]->prod = temp; 
    free(temp); 

Третья строка выше освобождает память, которую вы поместили в substr.

2) поскольку вы освобождаете память здесь, вы ввели ошибку.
Недопустимо обращаться к памяти malloc после ее освобождения, поэтому некорректно пытаться напечатать temp_struct[i]->prod.

Решение?
Не free(temp), вместо этого в вашем цикле, чтобы освободить temp_struct[i], вам сначала нужно освободить temp_struct[i]->prod, как это

for(i=0; i<6; i++ )     
{
    free(temp_struct[i]->prod);
    free(temp_struct[i]);    
}
1 голос
/ 06 июля 2010

Джош, ваш temp_struct держится за подстроку ... вы не хотите освобождать подстроку, где вы в данный момент освобождаете ее. Недопустимое чтение поступает из этой строки:

for(i=0; i<6; i++ )
    printf("%s\n",temp_struct[i]->prod);

Вместо этого вы хотите освободить подстроку при освобождении временных структур, например:

for(i=0; i<6; i++ )
{
    free(temp_struct[i]->prod);
    free(temp_struct[i]);
}
0 голосов
/ 06 июля 2010

Не освобождает подстроки.В C подстрока является частью исходной строки.Если вы хотите получить подстроку, независимую от строки, используйте strdup.

...