如何在没有任何分段错误的情况下在此函数中分配内存
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;
但即使您采用这种方法,最好还是使用安全值初始化缓冲区。
当我尝试 运行 我的程序使用此函数时,出现分段错误,因为堆栈缓冲区已溢出。有人可以帮忙吗?
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;
但即使您采用这种方法,最好还是使用安全值初始化缓冲区。