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



嗯,我正在用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解决了这类问题。

相关内容

  • 没有找到相关文章

最新更新