运行时检查失败#2 - 变量original_block周围的堆栈已损坏

时间:2015-05-20 10:50:39

标签: c runtime-error visual-studio-2015

我担心之前已经问过这个问题了,我有点理解为什么它会给我这个错误,但老实说我找不到原因。我希望你能帮助我这些家伙吗?

我必须为我的班级制作DES算法,并且我已经迈出了第一步,它只在文本不太长时才起作用。出于某种原因,当我尝试输入一个非常长的文本时,它会给我这个错误。这是我的代码:

我存储所有64位块的结构。

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

我用来添加64位块的函数(unsigned char [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++;
}

和第一次扩展的功能:

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;
}

真正奇怪的是它给了我错误并且它停止了,但是当我检查窗口时,第一次扩展它是完整和正确的。我真的不知道发生了什么。我尝试释放结构中的字符,但它给了我一个错误。任何帮助将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:-1)

好吧,伙计们,我无法解决问题。所以我采取了不同的方法,现在它正在发挥作用。

我已将结构改为:

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

我改变了函数来初始化结构,但现在我还添加了我将使用的块数,所以首先我计算我需要多少64位块(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);

现在它正在运作。非常感谢你的帮助!