嗯,我正在用C语言做一个"二进制转换器",然后制作一个二进制计算器作为大学挑战的一部分。我以与我们手动相同的方式计算算法,但奇怪的是,它最多只能转换 127,当我尝试转换 128 时,我得到以下日志:
0 [main] teste 698 cygwin_exception::open_stackdumpfile: Dumping stack trace to teste.exe.stackdump
代码:
十进制宾函数 -
#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;
}
有人可以解释我这是怎么回事吗?
你从不为bin
分配一个以上的整数的空间,但你试图在那里存储多个整数。
欢迎来到 C 编程
瑞洛克手册: realloc() 函数将 ptr 指向的内存块的大小更改为字节大小。内容将在从区域开始到新旧大小的最小值的范围内保持不变
您的代码:bin = (int *) realloc(bin, sizeof(int));
因此,此行每次都将 4 个字节重新分配给"bin"。我猜它应该在每次迭代时增加 4 个字节: bin = (int *) realloc(bin, ++ind * sizeof(int));
然后不要在下一行递增。
至于程序在 127 上崩溃,您所看到的在 C/C++ 中很常见,因为对数组访问没有边界检查。它应该在输入 2 时崩溃,但不是由于代码编译方式的随机性以及有关 alloc 工作方式的详细信息(如果您要求的东西太小或不是 2 的幂,alloc 通常会给出比要求更大的块。
STL解决了这类问题。