Правильное использование malloc и strcat, чтобы избежать ошибок памяти с помощью valgrind - PullRequest
0 голосов
/ 09 июня 2019

Я сохранил вершины в моем хранилище tempStorage:

typedef struct {
    int pred[8];
    int succ[8];
} arc_set;

arc_set tempStorage;

например .pred - 0,1,1,2,2, а .succ - 2,2,3,3,1

Я сделал char *links = malloc(sizeof(char) * 100);, чтобы сохранить эти числа и напечатать их так:

            char *temp = malloc(10);

            for (int l = 0; l < 8; l++){

                    sprintf(temp, "%d-%d ", tempStorage.pred[l], tempStorage.succ[l]);
                    strcat(links, temp);

            }
            free(temp);

            fprintf(stdout, "Solution %d edges: %s",countLinks, links);
            fprintf(stdout, "\n");

хранит строки в формате "% d-% d" в temp с sprintf, а затем с strcat, сопоставляя это со ссылками.

он печатает все правильно, но когда я проверяю это с valgrind --leak-check=full --track-origins=yes -v ./programname, я получаю:

Conditional jump or move depends on uninitialised value(s)
==12322==    at 0x4C2C66A: strcat (vg_replace_strmem.c:307)
==12322==    by 0x4013CC: main (program.c:251)
==12322==  Uninitialised value was created by a heap allocation
==12322==    at 0x4C29BC3: malloc (vg_replace_malloc.c:299)
==12322==    by 0x401270: main (program.c:225)

где c: 251 - strcat(links, temp);, а c: 225 - мой char *links = malloc(sizeof(char) * 100);

я неправильно использую strcat или в чем здесь проблема?

1 Ответ

1 голос
/ 09 июня 2019

Память, полученная из malloc, по умолчанию не инициализируется нулями. И strcat добавит новый в конец строки. Для не инициализированного нулями порции памяти, которая может быть где угодно.

Вам не нужно устанавливать все links в ноль - достаточно будет только первого байта. Тем не менее memset(links, 0, 100); сразу после malloc не повредит.

...