Как всегда программирую под Android NDK.
Задача
Есть строка размером 32 байта. Нужно скопировать две подстроки по 8 байт с определенной позиции, а затем получить код каждого символа.
Написал код:
const char* str = "0a88d2e044ed675309eb79c6aa988ce2";
char* test1(){
char k[17];
strncpy(k, &str[3], 8);
strncpy(k + 8, &str[8], 8);
k[16] = 0;
return k;
}
char* test2(){
char* k = (char*) malloc(17 * sizeof(char));
memset(k, 0, 17);
memcpy(k, str + 3, 8);
memcpy(k + 8, str + 8, 8);
return k;
}
При вызове функций получаю одинаковый результат: 8d2e044e44ed6753.
Перебираю результат и получаю код символа:
c = test1 = test2
8 = 0 = 56
d = 17 = 100
2 = 0 = 50
e = 0 = 101
0 = 0 = 48
4 = 0 = 52
4 = 0 = 52
e = 0 = 101
4 = 0 = 52
4 = 17 = 52
e = 0 = 101
d = 0 = 100
6 = 0 = 54
7 = 17 = 55
5 = 0 = 53
3 = 0 = 51
test1 использует strncpy на экране — одно, а код — другой (видимо, кодировка своя какая-то).
Решил использовать test2, появились вопросы:
Обнуляю выделенную память в начале через
memset. Как ее обнулить после расширения памятиrealloc-ом? Или, например, выделил памяти 30 байт, использовал 10, как поставить 0 в конце строки, чтобы не получить весь хлам до первого нуля?Функция
test2вернула результат, я что-то сделал. Как освободить выделенную внутриtest2память? Если освободить память так (см. ниже), то при следующем вызове функция вернет всякий хлам.char* test2() { char* k = (char*) malloc(17 * sizeof(char)); memset(k, 0, 17); memcpy(k, str + 3, 8); memcpy(k + 8, str + 8, 8); const char* nk = k; free(k); return nk; }Как получить размер выделенной памяти?
char* k = (char*) malloc(17 * sizeof(char));Результат
sizeof(k)говорит о том, что выделено 8 байт. Но, если я правильно понимаю, в результате должно быть 17 байт.
17*sizeof(char)– nick_n_a Jun 13 '18 at 07:38test2возвращается мертвый указательfree(k); return nk;освобождать память необходимо после работы с указателем ,т.е. где-то вmain, т.е. указатель который вернула функция необходимо освобождать. – Jun 13 '18 at 07:48test1возвращает мертвый указатель - указатель на локальную переменную. Потому у вас "коды символов" для первого массива и получились бессмысленные. – AnT stands with Russia Jun 19 '18 at 14:47