调用函数时出现段错误

时间:2012-06-30 01:31:35

标签: c++ c segmentation-fault

我的程序在循环迭代中遇到seg错误。在调用函数intermediate之后,inter_value打印到inter_value[199][208],然后,我有一个seg错误。 为了确保它不受限制访问,我首先打印数组inter_value,阵列打印没有任何问题。

这是内存不足的象征吗?数组ctinter_valuemalloc创建,key_byte是一个静态数组。

D = 200;
K = 256;
for(j = 0; j < D; j++)
    for(i = 0; i < K; i++)
        printf("inter_value[%i][%i] = %i\n", j, i, inter_value[j][i]);

for(j = 0; j < D; j++) {
    for(i = 0; i < K; i++) {
        intermediate(ct[j][0], key_byte[i], &inter_value[j][i]);
        printf("inter_value[%i][%i] = %i\n", j, i, inter_value[j][i]);
        fflush(stdout);
    }
}
printf("rex\n");


for(j = 0; j < D; j++) {
    for(i = 0; i < K; i++) {
        hamming_dist(ct[j][0], inter_value[j][i], &h[j][i]);
    }
}

函数中间在这里

void intermediate(unsigned char ct, unsigned char key_byte, unsigned char *inter_value){
    *inter_value = getSBoxInvert(ct^key_byte);
}

编辑1:数组声明。

//initialize different intermediate values
inter_value = (unsigned char**)malloc(D * sizeof(unsigned char*));
if(inter_value == NULL){
    fprintf(stderr, "out of memory\n");
    return 0;
}
for(i = 0; i < D; i++){
    inter_value[i] = (unsigned char *)malloc(K * sizeof(unsigned char)); // this is fix to key size
    if(inter_value[i] == NULL){
        fprintf(stderr, "out of memory\n");
        return 0;
    }
}


//ct = malloc(row * sizeof(unsigned char*));
ct = (unsigned char**)malloc(D * sizeof(unsigned char*));
if(ct == NULL){
    fprintf(stderr, "out of memory\n");
    return 0;
}
for(i = 0; i < D; i++){
    //ct[i] = malloc(column * sizeof(unsigned char));
    ct[i] = (unsigned char *)malloc(column * sizeof(unsigned char));
    if(ct[i] == NULL){
        fprintf(stderr, "out of memory\n");
        return 0;
    }
}

unsigned char key_byte[256] = {0};

编辑2:在seg故障之前打印出来。

inter_value[199][233] = 214
inter_value[199][234] = 119
inter_value[199][2

编辑3:gdb输出(似乎它指向另一个函数)

编程接收信号SIGSEGV,分段故障。 crming_dist中的0x0804a3f5(ct = 31'\ 037',inter_value = 203'\ 313',h = 0x2)at cpa.cpp:53 53 * h = c;

编辑4:从gdb发出backtrace命令...

#0 0x0804a3f5 in hamming_dist(ct = 31'\ 037',inter_value = 203'\ 313',h = 0x2)at cpa.cpp:53

#1 0x0804aff5 in main(argc = 3,argv = 0xbffff2f4)at cpa.cpp:266

编辑5:在它之前添加hamming_dist函数调用和printf调用。

编辑6:初始化h

int **h;
h = (unsigned int**)malloc(D * sizeof(unsigned int*));
if(h == NULL){
    fprintf(stderr, "out of memory\n");
    return 0;
}
for(i = 0; i < D; i++){
    h[i] = (unsigned int*)malloc(K * sizeof(unsigned int)); // this is fix to key size
    if(h[i] == NULL){
        fprintf(stderr, "out of memory\n");
        return 0;
    }
}

编辑7:hamming_dist函数声明。

void hamming_dist(unsigned char ct, unsigned char inter_value, int *h){
    int temp;
    temp = ct ^ inter_value;
    //then count No. of ones
    int c; // c accumulates the total bits set in v
    for (c = 0; temp; c++)
        temp &= temp - 1; // clear the least significant bit set

    *h = c;
}

1 个答案:

答案 0 :(得分:4)

你的seg错误是因为&h[j][i]在作为hamming_dist参数h的值传递时是0x2,它试图取消引用它并存储到其中。这显然是因为早期的越界商店覆盖了h[j]

请注意,在malloced缓冲区中写出越界可能会产生一些效果,直到程序中的任意后续才显示。它们可能根本不会显示......直到您释放代码并且某些客户使用恰好触发错误的输入来运行它。