В
cur_str = malloc(2);
sprintf(cur_str,"%02x",arr[i]);
sprintf введите 3 символа, включая последний нулевой, в то время как вы выделили только 2
В
comp_str = malloc(sizeof(cur_str)+sizeof(prev_str));
длина allocate не правильная, потому что size_of
не возвращает то, что вы ожидаете, должно быть
comp_str = malloc(strlen(cur_str)+strlen(prev_str)+1);
, но, конечно, предполагается, что prev_str
также является правильной строкой в начале, иэто не тот случай
Эти два malloc вызовут утечки памяти, потому что нет свободных (или не используемых)
cur_str = malloc(sizeof(0));
comp_str = malloc(sizeof(0));
Почему вы не используете realloc для увеличения размера prev_str
?
Обратите внимание, что конечный необходимый размер легко узнать: sizeof(arr)/sizeof(arr[0]) * 2 + 1
если число ограничено 255 (2 цифры в гекса)
Предложение (без указания всех чисел <256): </p>
#include <string.h>
#include <stdlib.h>
int main()
{
int arr[] = {30,40,15,205};
size_t arr_length = sizeof(arr)/sizeof(arr[0]);
size_t i;
size_t sz = 0;
char * r = malloc(0);
for (i=0; i!= arr_length; ++i)
{
char s[20];
int l = sprintf(s, "%02x",arr[i]);
r = realloc(r, sz + l + 1);
strcpy(r + sz, s);
sz += l;
}
printf("%s %d\n", r, sz);
free(r);
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra a.c
pi@raspberrypi:/tmp $ ./a.out
1e280fcd 8
Исполнение под valgrind
pi@raspberrypi:/tmp $ valgrind ./a.out
==2985== Memcheck, a memory error detector
==2985== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2985== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==2985== Command: ./a.out
==2985==
1e280fcd 8
==2985==
==2985== HEAP SUMMARY:
==2985== in use at exit: 0 bytes in 0 blocks
==2985== total heap usage: 6 allocs, 6 frees, 1,048 bytes allocated
==2985==
==2985== All heap blocks were freed -- no leaks are possible
==2985==
==2985== For counts of detected and suppressed errors, rerun with: -v
==2985== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)