Там нет типа данных строки в языке программирования C. Строки в C представлены в виде массива символов.
Примечание: C-строки являются символьным массивом, заканчивающимся символом '\ 0'. Это означает, что последний символ в любой C-String в C будет использоваться для хранения символа '\ 0', который отмечает конец строки. Чтобы сохранить n
символов в C-String в C, вы должны определить массив символов размером (n+1)
.
Почему мы должны прекратить его с помощью '\ 0'?
'\0' termination
это то, что отличает char array
от c-string
в C programming language
. Большинство функций управления строкой (например, strcpy
) полагаются на символ «\ 0», чтобы знать, когда строка завершена (и ее работа завершена!), И не будет работать с простым char-массивом (например, они будут продолжать работая за границами массива, и продолжайте, пока он не найдет символ «\ 0» где-то в памяти - часто развращает память по мере ее поступления).
Поэтому сохранение символа '\ 0' (в конце) необходимо, если вы хотите использовать функции #include <string.h>
, например strcpy()
, поскольку они полагаются на символ '\ 0', чтобы пометить конец массива символов.
'\ 0' определяется как пустой символ - это символ со всеми битами, установленными в ноль (и, следовательно, имеет значение 0). Это не имеет никакого отношения к указателям. Узнайте больше об этом here.
В вашей программе, вы хотите, два символьных массива key (dynamically allocated)
и s
держать копию другого массива символов key2
размера keysize
. Затем оба массива символов должны быть по крайней мере keysize + 1
(+1 для сохранения символа '\ 0').
Изменение:
char* key = (char*)malloc(sizeof(keySize));
To:
char* key = malloc(keySize+1); // Don't Type-Cast malloc
И
Изменение:
char s[keySize-1];
Для
char s[keySize+1];
Пожалуйста, более конкретно, то, что вы хотите сделать и что на самом деле происходит. Но последняя итерация циклов записывает не выделенную память (1 за вашим массивом), так что это уже UB. –
sizeof (keySize) возвращает размер int, который обычно составляет 4 байта. вы уверены, что это то, что вы хотите? после этого вы копируете (keySize) количество байтов в ключ – user3109672
'char s [keySize-1];' неверно, если ключ был '1', вы пытаетесь выделить память для' 0' байт. Избавьтесь от '-1'. Кроме того, 'sizeof (keysize)' вернет вам размер переменной в памяти, которая равна 4/8 байтам в вашем случае, избавиться от 'sizeof'. Это, однако, не решит вашу проблему. Расширьте свой вопрос и покажите нам код функции 'getCharacter()'. – ProXicT