У меня возникли проблемы с malloc
, массивами указателей и memcpy
. У меня есть строка, называемая hex_string, которая всегда имеет длину, делящуюся на 8. Я пытаюсь разбить эту строку на подстроки, каждая из которых имеет 8 символов. Это отлично работает, когда у меня есть 16 символов в строке, но если я увеличу это до 24 символов и более, я получаю ошибку сегментации. Может ли кто-нибудь помочь мне в качестве причины? Я знаю, что я использую много циклов, которые, по сути, запускают один и тот же цикл, я буду конденсировать их, но я хотел бы сделать каждую часть программы отдельно для начала.Получение ошибки сегментации с memcpy
int main (int argc, char * argv[]) {
const char * hex_string = "1c0111001f010100abcdef12";
/* Using this value for hex_string fails - but if the
string is replaced with "1c0111001f010100" the program runs fine. */
int string_length = strlen(hex_string);
/* get the number of 8 character substrings needed
(using ceil to allow me to expand this to arbitrary length strings in the future) */
int num_of_blocks = (int)ceil((double)string_length/8);
/* allocate memory for pointers to each substring */
char ** hex_array = (char **) malloc(num_of_blocks * sizeof(char));
/* allocate 9 bytes for each substring
to allow for the 8 characters and the null-terminator. */
for (int i = 0; i < num_of_blocks; i++)
hex_array[i] = (char *) malloc(9);
/* split the strings into 8-character substrings and add a null-terminator */
for (int i = 0; i < num_of_blocks; i++) {
memcpy(hex_array[i], hex_string+(i*8), 8);
(hex_array[i])[8] = '\0';
}
/* print each substring */
for (int i = 0; i < num_of_blocks; i++)
printf("substring %d = %s\n",i,hex_array[i]);
/* free the memory allocated for each substring */
for (int i = 0; i < num_of_blocks; i++)
free(hex_array[i]);
/* free the memory allocated for the pointers to the substrings */
free(hex_array);
return 0;
}
Я не вижу переменную 'num_of_32s', определенную где угодно. Это какой-то глобальный, который не отображается в вашем коде? –
Если это не проблема с нулевым завершением, я пойду без пива в течение недели. –
К сожалению, я хотел изменить num_of_32s на num_of_blocks при копировании кода, но забыл изменить последние несколько. Я думал, что это будет легче понять! В моей программе они имеют 8 символов шестнадцатеричного значения, поэтому 32-битные значения. – andrew1601