作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试使用此函数运行程序时,出现段错误,因为堆栈缓冲区溢出。有人可以帮忙吗?
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/
我是一名优秀的程序员,十分优秀!