2015-08-26 3 views
0

У меня возникли проблемы с 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; 
} 
+0

Я не вижу переменную 'num_of_32s', определенную где угодно. Это какой-то глобальный, который не отображается в вашем коде? –

+0

Если это не проблема с нулевым завершением, я пойду без пива в течение недели. –

+0

К сожалению, я хотел изменить num_of_32s на num_of_blocks при копировании кода, но забыл изменить последние несколько. Я думал, что это будет легче понять! В моей программе они имеют 8 символов шестнадцатеричного значения, поэтому 32-битные значения. – andrew1601

ответ

4

Основная проблема заключается в использовании неправильного типа в распределении памяти - общая ошибка.

// char ** hex_array = (char **) malloc(num_of_blocks * sizeof(char)); 
char ** hex_array = (char **) malloc(num_of_blocks * sizeof(char *)); 

С твердым соглашением с @Matt McNabb, рекомендуем использовать следующее. Нет необходимости в литье. Легче кодировать. Легче поддерживать. И в этом случае менее вероятно, чтобы получить неправильный тип.

pointer_variable = malloc(n * sizeof *pointer_variable); 

char ** hex_array = malloc(num_of_blocks * sizeof *hex_array);