首页 > 解决方案 > C 代码适用于本地设备,但不适用于 leetcode

问题描述

我正在尝试解决这个leetcode 问题

我的解决方案在我自己的计算机上运行良好,但是当我尝试在 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);
}

标签: cmemory-managementbuffer-overflow

解决方案


在“转换”中,您为字符串的确切长度分配内存。AC String 由 a 终止,0-byte因此您必须分配这个额外的bayte并将其初始化为0.

char* string = malloc(string_len+1);
string[string_len] = 0;

这样,在函数退出后,字符串现在是一个正确的 C 字符串,并且find()不会超出缓冲区。


推荐阅读