2015-05-20 4 views
-1

Я боюсь, что этот вопрос задан раньше, и я понимаю, почему он дает мне эту ошибку, но я честно не могу найти, почему именно. Хотел бы я, чтобы ты помог мне с этими парнями?Ошибка проверки выполнения во время выполнения # 2 - поврежден стек переменной_имя_файла

Мне нужно сделать алгоритм DES для моего класса, и я уже сделал первый шаг, и он работает только тогда, когда текст не слишком длинный. По какой-то причине, когда я пытаюсь ввести очень длинный текст, он дает мне эту ошибку. Вот мой код:

Структура, в которой я храню все 64-битные блоки.

typedef struct { 
    int size; 
    int capacity; 
    unsigned char *block[8]; 
}Blocks64; 

Функция, которую я использую, чтобы добавить 64-битовый блок с (символ без знака [8])

void add_64bBlock(Blocks64 *block, char *value) { 
    int i; 
    block->block[block->size] = malloc(sizeof(unsigned char)); 
    for (i = 0; i < 8; i++) { 
     block->block[block->size][i] = '\x0'; 
    } 
    for (i = 0; i < 8; i++) { 
     block->block[block->size][i] = value[i]; 
    } 
    block->size++; 
} 

и функция для первого expantion:

Blocks64 expansionI(char *plain) { 
    Blocks64 original_block;//Estructura para bloques del texto plano 
    Blocks64 expanded_block;//Estructura para el texto ya expandido de expansionI 
    int total_blocks;//Bloques totales 
    int i; 
    int j; 
    int k; 
    unsigned char byte[8];//bloque de 64 bits auxiliar 

    //Cálculo del total de Bloques 
    total_blocks = ceil(strlen(plain)/8.0); 
    init_64bBlock(&original_block); 
    init_64bBlock(&expanded_block); 
    printf("bloques: %d\n", total_blocks); 

    //Pasar el texto plano a bloques en la estructura 
    for (i = 0; i<total_blocks; i++) { 
     init_byte(byte); 
     for (j = 0; j<8; j++) { 
      if(plain[(j + (i * 8))] == '\x0') 
       j = 8; 
      else 
       byte[j] = plain[(j + (i * 8))]; 
     } 
     add_64bBlock(&original_block, byte); 
     //add_64bBlock_null(&expanded_block); 
    } 

    //Propósitos de Debuggeo 
    for (i = 0; i<total_blocks; i++) { 
     printf("Bloque %d\n",i+1); 
     for (j = 0; j < 8; j++) { 
      printf("%d.- %c - %d - ", j, get_64bBlock(&original_block, i)[j], get_64bBlock(&original_block, i)[j]); 
      printbinchar(get_64bBlock(&original_block, i)[j]); 
      printf("\n"); 
     } 
    } 

    for (i = 0; i < total_blocks; i++) { 
     init_byte(byte); 
     for (j = 0; j < 4; j++) { 
      for (k = 7; k >= 0; k--) { 
       if ((get_64bBlock_char(&original_block, i, k) & (1 << 6 - (j * 2))) > 0) { 
        byte[j] = byte[j] | (1 << k); 
       } 
      } 
     } 
     for (j = 0; j < 4; j++) { 
      for (k = 7; k >= 0; k--) { 
       if ((get_64bBlock_char(&original_block, i, k) & (1 << 7 - (j * 2))) > 0) { 
        byte[j+4] = byte[j+4] | (1 << k); 
       } 
      } 
     } 
     add_64bBlock(&expanded_block,byte); 
    } 
    //Debuggeo 
    printf("---------------\n"); 
    for (i = 0; i < total_blocks; i++) { 
     printf("El bloque %d\n",i); 
     printf("L0:\n"); 
     for (j = 0; j < 4; j++) { 
      printf("%d.- %c - %d - ", j, get_64bBlock_char(&expanded_block, i, j), get_64bBlock_char(&expanded_block, i, j)); 
      printbinchar(get_64bBlock_char(&expanded_block, i, j)); 
      printf("\n"); 
     } 
     printf("R0:\n"); 
     for (j = 4; j < 8; j++) { 
      printf("%d.- %c - %d - ", j, get_64bBlock_char(&expanded_block, i, j), get_64bBlock_char(&expanded_block, i, j)); 
      printbinchar(get_64bBlock_char(&expanded_block, i, j)); 
      printf("\n"); 
     } 
    } 
    return expanded_block; 
} 

что действительно странно что он дает мне ошибку и останавливается, но когда я проверяю окно, первое расширение будет полным и правильным. Я не знаю, что происходит. Я попытался освободить символы внутри структуры, но это дает мне ошибку. Любая помощь могла бы быть полезна. Заранее спасибо.

+0

Кроме того, я обнаружил, что ошибка возникает, когда я печатаю более 64 букв (512 бит). –

+1

Почему вы «block-> block [block-> size] = malloc (sizeof (unsigned char));' malloc() одиночный unsigned char, когда вы хотите 'for (i = 0; i <8; i ++) { блок-> блок [блок-> размер] [i] = '\ x0'; } 'доступ не менее восьми из них? – EOF

+0

Вы знаете, что @EOF, вы правы ... это было именно то, что я заметил. Позвольте мне проверить, может быть, это проблема. –

ответ

-1

Хорошо, ребята, я не смог решить проблему. Поэтому я принял другой подход, и теперь он работает.

Я изменил structurue к этому:

typedef struct { 
    int size; 
    int capacity; 
    unsigned char *block; 
}Blocks64; 

И я изменил функцию, чтобы инициализировать структуру, но теперь я также добавить, сколько блоков я буду использовать, поэтому сначала я вычислить, сколько 64bit блоки (8 неподписанных символов) мне нужно:

void init_64bBlock(Blocks64 *block,int total) { 
    block->size = 0; 
    block->capacity = total; 
    block->block = malloc(sizeof(unsigned char) * (8 * total)); 
} 

и использовать его прямо здесь:

total_blocks = ceil(strlen(plain)/8.0); 
init_64bBlock(&original_block,total_blocks); 
init_64bBlock(&expanded_block,total_blocks); 

Теперь он работает. Большое спасибо за Вашу помощь!

Смежные вопросы