尝试在 C 中的向量中分配内存时出现奇怪的错误
Bizarre bug when trying to allocate memory in a vector in C
好吧,我正在用 C 做一个 "binary converter",然后制作一个二进制计算器作为大学挑战的一部分。我按照我们手工计算的方式计算出算法,但奇怪的是,它最多只能转换为 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;
}
谁能给我解释一下这是怎么回事?
您从未为 bin
分配 space 多个整数,但您尝试在其中存储多个整数。
欢迎使用 C 编程
重新分配手册:
realloc() 函数将 ptr 指向的内存块的大小更改为 size bytes。从区域开始到新旧大小的最小值范围内内容将保持不变
您的代码:
bin = (int *) realloc(bin, sizeof(int));
所以这一行每次都将 4 个字节重新分配给 'bin'。它应该在每次迭代中增加 4 个字节,我猜是这样的:
bin = (int *) realloc(bin, ++ind * sizeof(int));
然后在下一行不递增。
至于程序在 127 上崩溃,您所看到的在 C/C++ 中很常见,因为数组访问没有边界检查。它 应该 在输入 2 时崩溃,但不是由于代码编译方式的随机性以及 alloc 如何工作的细节(alloc 通常会提供比要求的更大的块如果你要求的东西太小或者不是 2 的幂。)
STL 解决了这类问题。
好吧,我正在用 C 做一个 "binary converter",然后制作一个二进制计算器作为大学挑战的一部分。我按照我们手工计算的方式计算出算法,但奇怪的是,它最多只能转换为 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;
}
谁能给我解释一下这是怎么回事?
您从未为 bin
分配 space 多个整数,但您尝试在其中存储多个整数。
欢迎使用 C 编程
重新分配手册: realloc() 函数将 ptr 指向的内存块的大小更改为 size bytes。从区域开始到新旧大小的最小值范围内内容将保持不变
您的代码: bin = (int *) realloc(bin, sizeof(int));
所以这一行每次都将 4 个字节重新分配给 'bin'。它应该在每次迭代中增加 4 个字节,我猜是这样的: bin = (int *) realloc(bin, ++ind * sizeof(int));
然后在下一行不递增。
至于程序在 127 上崩溃,您所看到的在 C/C++ 中很常见,因为数组访问没有边界检查。它 应该 在输入 2 时崩溃,但不是由于代码编译方式的随机性以及 alloc 如何工作的细节(alloc 通常会提供比要求的更大的块如果你要求的东西太小或者不是 2 的幂。)
STL 解决了这类问题。