C++ 调用函数时出现Seg错误 我的程序在循环迭代的过程中经历了SEG故障。调用函数intermediate后,inter_值一直打印到inter_值[199][208],然后,我有一个seg故障。 为了确保它不是越界访问,我首先打印数组inter_值,数组打印时没有任何问题

C++ 调用函数时出现Seg错误 我的程序在循环迭代的过程中经历了SEG故障。调用函数intermediate后,inter_值一直打印到inter_值[199][208],然后,我有一个seg故障。 为了确保它不是越界访问,我首先打印数组inter_值,数组打印时没有任何问题,c++,c,segmentation-fault,C++,C,Segmentation Fault,这是内存不足的象征吗?数组ct和inter_值由malloc创建,key_字节为静态数组 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++) {

这是内存不足的象征吗?数组ct和inter_值由malloc创建,key_字节为静态数组

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]);
    }
}
编辑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};
编辑3:gdb输出它似乎指向另一个函数

程序接收信号SIGSEGV,分段故障。 哈明区ct=31'\037'中的0x0804a3f5,cpa处的内部值=203'\313',h=0x2。cpp:53 53*h=c

编辑4:从gdb发出回溯命令后

0 0x0804a3f5在汉明区ct=31'\037',内部值=203'\313',在cpa处h=0x2。cpp:53

主argc=3中的1 0x0804aff5,cpp处的argv=0xbfff2f4。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;
    }
}
seg错误是因为当作为hamming_dist参数h的值传递时,&h[j][i]是0x2,该参数尝试取消引用并存储到其中。这显然是因为早期的越界存储重写了h[j]

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

您的seg错误是因为&h[j][i]作为hamming_dist参数h的值传递时为0x2,该参数尝试取消引用并存储到其中。这显然是因为早期的越界存储重写了h[j]



请注意,在malloced缓冲区中写入越界可能会产生一些效果,这些效果在程序的稍后部分才会出现。他们可能根本不会出现。。。直到您发布代码,并且一些客户使用恰好触发错误的输入运行代码。

打印该值不足以证明您没有访问越界。inter_值是如何声明的?请提供一个显示问题的最小完整示例,请确保正在刷新您的printfs。看在里奇的份上,用调试器@金巴特:事实上这不是无害的。在一些较旧的编译器上,例如实现C89强制转换的VS,返回值可能会隐藏您忘记包含stdlib.h的事实,因为它将被假定为返回int。。实际上,您不应该编写不必要的代码,这表明编写代码的人并不真正理解C如何处理指针类型使用malloc结果在C中不是一个好主意,因为它可以伪装一个未声明的malloc,编译器认为该malloc正在返回int,所以打印该值不足以证明您没有访问越界。inter_值是如何声明的?请提供一个显示问题的最小完整示例,请确保正在刷新您的printfs。看在里奇的份上,用调试器@金巴特:事实上这不是无害的。在一些较旧的编译器上,例如实现C89强制转换的VS,返回值可能会隐藏您忘记包含stdlib.h的事实,因为它将被假定为返回int。。实际上,您不应该编写不必要的代码,这表明编写代码的人并不真正理解C如何处理指针类型在C中隐藏malloc结果不是一个好主意,因为它可以隐藏未声明的malloc,编译器认为该malloc返回intI实际初始化h。。。请参阅我的编辑6。我还添加了hamming_dist函数定义。请停止所有这些编辑,只需按顺序发布程序的相关部分。事实上,&h[j][i]在传递给hamming_dist时的值为0x2,而hamming_dist的值为*h=c;,这将导致seg故障。花更多的时间找出原因,花更少的时间将代码片段发布到SO。当h的值为==>2时,它对您来说如何完美?您的越界存储可能重写了h。我的回答仍然是正确的,所以你应该接受它,尽管我付出了所有的努力。而且,如果你包含了整个程序,而不仅仅是片段,这里的人会看到这个越界存储。。。请参阅我的编辑6。我还添加了hamming_dist函数定义。请停止所有这些编辑,只需按顺序发布程序的相关部分。事实上,&h[j][i]在传递给hamming_dist时的值为0x2,而hamming_dist的值为*h=c;,这将导致seg故障。花更多的时间找出原因,花更少的时间将代码片段发布到SO。当h的值为==>2时,它对您来说如何完美?您的越界存储可能重写了h。我的回答仍然是正确的,所以你应该接受它,尽管我付出了所有的努力。而且,如果你包括了整个计划,而不仅仅是斯尼普 ts,这里有人会看到那个出界的商店。
inter_value[199][233] = 214
inter_value[199][234] = 119
inter_value[199][2
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;
    }
}
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;
}