gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:25:32 25 4
gpt4 key购买 nike

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

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] = '\0';
a = a / 2;
}
if (number == 0) {
a = 0;
bit = 0 + '0';
binary[len++] = bit;
binary[len] = '\0';
}
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 遍历数组,从第一个元素开始,计算非终止字符。它不会停止,直到找到终止点 ('\0')。如果您运气不好,可能会进入未初始化的数据,并且可能会远远超过您分配的 81 个字符。一段时间后,strlen 开始查看不允许的内存,并且您会遇到段错误(您的程序已探索其分配的内存段之外)。

您可以通过多种方式解决此问题。最简单的是:

char binary[81] = { 0 };

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

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

size_t len = 0;

但即使您采用这种方法,使用安全值初始化缓冲区也是一个很好的做法。

关于c - 如何在没有任何段错误的情况下在此函数中分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58631646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com