如何在没有任何分段错误的情况下在此函数中分配内存

How do I allocate the memory in this function without any segmentation fault

当我尝试 运行 我的程序使用此函数时,出现分段错误,因为堆栈缓冲区已溢出。有人可以帮忙吗?

void converttobin(int a,  int b, char x) {
    char binary[81];
    int number = 0;
    char bit;
    char original[81];
    int dividing = 0;
    number = a;
    size_t len = strlen(binary);
    while (a != 0) {
        dividing = a % 2;
        bit = dividing + '0';
        binary[len++] = bit;
        binary[len] = '[=10=]';
        a = a / 2;
    }
    if (number == 0) {
        a = 0;
        bit = 0 + '0';
        binary[len++] = bit;
        binary[len] = '[=10=]';
    }
    strncpy(original, binary, strlen(original));
    reverse(binary, number, b);
    comparing(binary, original,number, b, x);
    memset(binary, 0, strlen(binary));
    memset(original, 0, strlen(original));
}

正如@Christian Gibbons 在他的评论中指出的那样,当您调用 strlen 时,binary 未初始化。但这是什么意思?

strlen 遍历数组,从第一个元素开始,计算非终止字符。它在找到终止符 ('[=15=]') 之前不会停止。如果你不走运,那可能会进入未初始化的数据很长的路要走,并且可能远远超过你分配的 81 个字符。一段时间后,strlen 开始查看不允许查看的内存,您会遇到分段错误(您的程序已在其分配的内存段之外进行探索)。

您可以通过几种方式解决这个问题。最简单的是:

char binary[81] = { 0 };

这要求编译器将第一个元素设置为零(终止符)。这很好,因为它是 strlen 将看到并立即停止的第一个字符,报告您的字符串长度为 0。

但是看看你的算法,你可以完全放弃对 strlen 的调用并执行:

size_t len = 0;

但即使您采用这种方法,最好还是使用安全值初始化缓冲区。