Я боюсь, что этот вопрос задан раньше, и я понимаю, почему он дает мне эту ошибку, но я честно не могу найти, почему именно. Хотел бы я, чтобы ты помог мне с этими парнями?Ошибка проверки выполнения во время выполнения # 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;
}
что действительно странно что он дает мне ошибку и останавливается, но когда я проверяю окно, первое расширение будет полным и правильным. Я не знаю, что происходит. Я попытался освободить символы внутри структуры, но это дает мне ошибку. Любая помощь могла бы быть полезна. Заранее спасибо.
Кроме того, я обнаружил, что ошибка возникает, когда я печатаю более 64 букв (512 бит). –
Почему вы «block-> block [block-> size] = malloc (sizeof (unsigned char));' malloc() одиночный unsigned char, когда вы хотите 'for (i = 0; i <8; i ++) { блок-> блок [блок-> размер] [i] = '\ x0'; } 'доступ не менее восьми из них? – EOF
Вы знаете, что @EOF, вы правы ... это было именно то, что я заметил. Позвольте мне проверить, может быть, это проблема. –