尝试在C中的向量中分配内存时出现异常错误

时间:2019-08-23 22:31:15

标签: c gcc malloc realloc calloc

好吧,我正在用C语言编写“二进制转换器”,然后将二进制计算器作为大学挑战的一部分。我用手工完成算法的方式得出了该算法,但奇怪的是,它最多只能转换127,当我尝试转换128时,会得到以下日志:

0 [main] teste 698 cygwin_exception::open_stackdumpfile: Dumping stack trace to teste.exe.stackdump

代码:

decToBin函数-

#define BASE 2
int* decToBin(int decimal){
    int rest = 0, ind = 0;
    int *bin = (int *) calloc(1, sizeof(int));

    while(decimal >= BASE){
        rest = decimal % BASE;
        bin[ind] = rest;
        bin = (int *) realloc(bin, sizeof(int));
        ind++;
        decimal /= BASE;
    }

    bin = (int *) realloc(bin, 2*sizeof(int));
    bin[ind] = decimal;
    bin[++ind] = -1;

    return bin;
}

主要功能-

int main(){
    int* binary = decToBin(128);
    for(int i = 0; binary[i] != -1; i++){
        printf("%d ", binary[i]);
    }
    return 0;
}

有人可以解释我发生了什么事

2 个答案:

答案 0 :(得分:2)

您永远不会为bin分配一个以上整数的空间,但是您尝试在其中存储多个整数。

答案 1 :(得分:0)

欢迎使用C编程

重新分配手册: realloc()函数将ptr指向的内存块的大小更改为大小字节。从区域开始到新旧尺寸的最小值之间的范围,内容将保持不变

您的代码: bin =(int *)realloc(bin,sizeof(int));

因此,此行每次都将4个字节重新分配给“ bin”。我猜它应该在每次迭代中将其增长4个字节: bin =(int *)realloc(bin,++ ind * sizeof(int));

然后不要在下一行递增。

关于程序在127崩溃,由于对数组访问没有边界检查的事实,您在C / C ++中看到的是很常见的。输入2时,它应该 崩溃,但这并不是由于代码的编译方式以及alloc的工作方式的随机性造成的(通常,alloc会比请求的块大很多对于太小的东西或不是2的幂的东西。)

STL解决了这类问题。