C 代码可以在本地设备上运行,但不能在 leetcode 上运行
C code works on local device but doesn't work on leetcode
我正在尝试解决这个问题leetcode problem
我的解决方案在我自己的计算机上运行良好,但是当我尝试在 leetcode
上 运行 时出现错误
我得到的错误是这样的:
==31==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000033 at pc 0x55679c033f3b bp 0x7ffe5ea0aca0 sp 0x7ffe5ea0ac90
当我在转换函数中为字符串变量而不是string_len分配一个固定值时,错误得到解决。
我该如何解决这个问题?
请原谅我的英语不好
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int find(int item, int* array) {
int index;
for (index = 0; array[index] != item; index++);
return index;
}
int pow2ten(int number, int time) {
for (int count = 0; count < time; count++)
number = number * 10;
return number;
}
int count_len(int number) {
int count = 1;
for (number = number/10; number; number = number/10)
count++;
return count;
}
int compare(int number_1, int number_2)
{
int len_1 = count_len(number_1);
int len_2 = count_len(number_2);
number_1 = pow2ten(number_1, len_2 - len_1);
number_2 = pow2ten(number_2, len_1 - len_2);
return number_2 > number_1;
}
char* convert(int number) {
int string_len = count_len(number);
char* string = malloc(string_len);
for (int index = string_len; number; number = number / 10)
string[--index] = (number%10) + '0';
return string;
}
char* largestNumber(int nums[], int numsSize) {
int number, number_len;
number = number_len = 0;
for (int count = 0; count < numsSize; count++)
number_len = number_len + count_len(nums[count]);
int part_len = 0;
for (int time = 0; time < number_len; time = time + part_len) {
int part = 0;
for (int count = 0; count < numsSize; count++)
if (compare(part, nums[count]))
part = nums[count];
part_len = count_len(part);
nums[find(part, nums)] = 0;
part = pow2ten(part, number_len - time - part_len);
number = number + part;
}
return convert(number);
}
在'convert'中,您为字符串分配了精确长度的内存。 C 字符串以 0-byte
结尾,因此您必须分配这个额外的 bayte 并将其初始化为 0
.
char* string = malloc(string_len+1);
string[string_len] = 0;
这样在函数退出后字符串现在是一个正确的 C 字符串并且find()
不会超出缓冲区。
我正在尝试解决这个问题leetcode problem
我的解决方案在我自己的计算机上运行良好,但是当我尝试在 leetcode
上 运行 时出现错误我得到的错误是这样的:
==31==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000033 at pc 0x55679c033f3b bp 0x7ffe5ea0aca0 sp 0x7ffe5ea0ac90
当我在转换函数中为字符串变量而不是string_len分配一个固定值时,错误得到解决。 我该如何解决这个问题?
请原谅我的英语不好
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int find(int item, int* array) {
int index;
for (index = 0; array[index] != item; index++);
return index;
}
int pow2ten(int number, int time) {
for (int count = 0; count < time; count++)
number = number * 10;
return number;
}
int count_len(int number) {
int count = 1;
for (number = number/10; number; number = number/10)
count++;
return count;
}
int compare(int number_1, int number_2)
{
int len_1 = count_len(number_1);
int len_2 = count_len(number_2);
number_1 = pow2ten(number_1, len_2 - len_1);
number_2 = pow2ten(number_2, len_1 - len_2);
return number_2 > number_1;
}
char* convert(int number) {
int string_len = count_len(number);
char* string = malloc(string_len);
for (int index = string_len; number; number = number / 10)
string[--index] = (number%10) + '0';
return string;
}
char* largestNumber(int nums[], int numsSize) {
int number, number_len;
number = number_len = 0;
for (int count = 0; count < numsSize; count++)
number_len = number_len + count_len(nums[count]);
int part_len = 0;
for (int time = 0; time < number_len; time = time + part_len) {
int part = 0;
for (int count = 0; count < numsSize; count++)
if (compare(part, nums[count]))
part = nums[count];
part_len = count_len(part);
nums[find(part, nums)] = 0;
part = pow2ten(part, number_len - time - part_len);
number = number + part;
}
return convert(number);
}
在'convert'中,您为字符串分配了精确长度的内存。 C 字符串以 0-byte
结尾,因此您必须分配这个额外的 bayte 并将其初始化为 0
.
char* string = malloc(string_len+1);
string[string_len] = 0;
这样在函数退出后字符串现在是一个正确的 C 字符串并且find()
不会超出缓冲区。