【问题标题】:Bizarre bug when trying to allocate memory in a vector in C尝试在 C 中的向量中分配内存时出现奇怪的错误
【发布时间】:2019-12-29 05:09:00
【问题描述】:

嗯,我正在用 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;
}

谁能解释一下这是怎么回事?

【问题讨论】:

  • 您可能想了解realloc 的工作原理。

标签: c gcc malloc realloc calloc


【解决方案1】:

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

【讨论】:

  • 好的,我现在明白代码中发生了什么,但是你能解释一下为什么算法可以工作到 127 吗?
  • @motorola 未定义的行为未定义。另见c-faq.com/malloc/badalloc.htmlc-faq.com/malloc/badalloc2.html
  • @motorola 它实际上不能达到 127。通常,我们将代码描述为当它完成我们期望它做的事情时工作。查看代码,我预计它会在两三个字节后崩溃或出错。它不会那样做。所以它真的不能工作到 127。如果你的意思是为什么它做你想让它做的事情到 127,那是因为没有规则要求它做任何特定的事情。
【解决方案2】:

欢迎来到 C 编程

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

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

所以这条线每次都将 4 个字节重新分配给 'bin'。它应该在每次迭代中增加 4 个字节,我猜是这样的: bin = (int *) realloc(bin, ++ind * sizeof(int));

然后不要在下一行增加。

关于在 127 上崩溃的程序,您所看到的在 C/C++ 中很常见,因为没有对数组访问进行边界检查。它应该在输入 2 时崩溃,但不是由于您的代码如何编译的随机性以及有关 alloc 工作原理的详细信息(如果您询问,alloc 通常会给出比所要求的更大的块对于太小或不是 2 的幂的东西。)

STL 解决了这类问题。

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2021-07-05
    • 2023-03-07
    • 2018-05-26
    • 2020-04-23
    • 2021-08-05
    相关资源
    最近更新 更多