Leetcode "Two Sums"的C解决方案有运行时错误

标签 c runtime-error

我刚刚完成了 Leetcode “Two Sums” 的 C 解法。但网站说“运行时错误”,没有说哪一行代码是错误的。以下代码在 Xcode 中完美运行。我的代码有什么问题吗?

int* twoSum(int* nums, int numsSize, int target);

int main(int argc, const char * argv[]) {
    int nums[] = { 1, 2, 4, 8, 16};
    int numsSize = 5;
    int target = 10;
    int *answer = twoSum(nums, numsSize, target);

    printf("index1 = %d, index2 = %d\n", answer[0], answer[1]);

    return 0;
}

struct bucketLayer {
    int data;
    int index;
    struct bucketLayer* ptr;
};

struct result {
    int found;
    int index;
};

struct bucketLayer *addData(int data, int index, struct bucketLayer *targetPtr);
struct result findData(int data, int firstIndex, struct bucketLayer *targetPtr);
struct bucketLayer *freeBucket(struct bucketLayer *bucketPtr);

int* twoSum(int* nums, int numsSize, int target) {
    struct bucketLayer *buckets[target];

    int *answer = (int *)malloc(2 * sizeof(int));

    for (int i = 0; i < numsSize; i++) {
        buckets[nums[i] % target] = addData(nums[i], i, buckets[nums[i] % target]);
    }

    for (int i = 0; i < numsSize - 1; i++) {
        struct result findResult = findData(target - nums[i], i, buckets[target - nums[i] % target]);
        if (findResult.found) {
            if (findResult.index > i) {
                answer[0] = i+1;
                answer[1] = findResult.index + 1;
                return answer;
            } else {
                answer[0] = findResult.index + 1;
                answer[1] = i + 1;
                return answer;
            }
        }
    }

    for (int i = 0; i < target; i++) {
        buckets[i] = freeBucket(buckets[i]);
    }

    return answer;
}

struct bucketLayer *addData(int data, int index, struct bucketLayer *targetPtr) {
    if (targetPtr == NULL) {
        targetPtr = (struct bucketLayer *)malloc(sizeof(struct bucketLayer));
        targetPtr->data = data;
        targetPtr->index = index;
        targetPtr->ptr = NULL;
    } else {
        targetPtr->ptr = addData(data, index, targetPtr->ptr);
    }

    return targetPtr;
}

struct result findData(int data, int firstIndex, struct bucketLayer *targetPtr) {
    struct result findResult;
    if (targetPtr == NULL) {
        findResult.found = 0;
        return findResult;
    } else {
        if (targetPtr->data == data && targetPtr->index != firstIndex) {
            findResult.found = 1;
            findResult.index = targetPtr->index;
            return findResult;
        } else {
            return findData(data, firstIndex, targetPtr->ptr);
        }
    }
}

struct bucketLayer *freeBucket(struct bucketLayer *bucketPtr) {
    if (bucketPtr != NULL) {
        bucketPtr->ptr = freeBucket(bucketPtr->ptr);
        free(bucketPtr);
    }
    return bucketPtr;
}

最佳答案

仔细查看代码后,问题是由于使用了指向struct bucketLayer的指针的可变长度数组而引入的。在这种情况下,虽然有一个可用的静态指针,但该指针未初始化并导致 addData 函数错误地处理该指针。只需要手动初始化即可:

struct bucketLayer *buckets[target];

for (int i = 0; i < target; i++)
    buckets[i] = NULL;

int *answer = malloc (2 * sizeof *answer);

for (int i = 0; i < numsSize; i++) {
    buckets[nums[i] % target] = addData(nums[i], i, buckets[nums[i] % target]);
}

addData 分配也可以减少为:

 targetPtr = malloc (sizeof *targetPtr);

关于Leetcode "Two Sums"的C解决方案有运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226952/

相关文章:

具有依赖项的 C++ 队列

c - 在 C 中如何使用指针递增变量?

java - 广度优先搜索错误

Java通过命令行从文件读取字符串作为 float 输入

c - C中指向对象和指针的区别(如何指向另一个指针)

c - fscanf() 替换我的 ADT 节点?

c++ - 为什么使用 `XGetInputFocus` 会导致段错误?

java - JavaFX-应用程序中的异常

c++ - 我无法通过 C++ 中的函数式编程重现函数内存

c - 我无法理解这个段错误