【问题标题】:Two Sums in C: segmentation fault when testingC中的两个和:测试时出现分段错误
【发布时间】:2021-10-17 07:24:29
【问题描述】:

我完成并通过了 leetcode 两个和的问题,但不知何故,当我尝试自己编写测试时,我一直遇到分段错误。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int *twoSum(int *nums, int numsSize, int target, int* returnSize){
    *returnSize = 2;
    int *returnValues = (int*)malloc(2 * sizeof(int));
    for (int i = 0; i < numsSize - 1; i++) {
        for (int j = i + 1; j < numsSize; j++) {
            if (nums[i] + nums[j] == target) {
                returnValues[0] = i;
                returnValues[1] = j;
                return returnValues;
            }
        }
    }
    
    return returnValues;
}

int main(){
    int nums[] = {0,1,2,3,4,5};
    int size = 6;
    int* resultSize;
    printf("First index:%d  \n", (twoSum(nums, size, 9, resultSize))[0]);
    printf("Second index:%d  \n", (twoSum(nums, size, 9, resultSize))[1]);
  return 0;
}

我尝试在 twoSum 函数中删除变量 *returnSize 并解决了这个问题。但是由于最初的问题需要这个 *returnSize 变量,我不知道如何在仍然使用 *returnSize 的同时提取 twoSum 返回数组中的项目而不会遇到分段错误。

感谢任何帮助!

【问题讨论】:

  • 变量resultSize是一个指针,但是它指向哪里?定义为非指针变量,使用指针操作符&amp;来传递一个指向它的指针。或者甚至需要它,因为返回的大小将总是等于2?
  • 另一方面,您的程序中存在内存泄漏。
  • Resultsize 是一个指针,但您没有分配内存来使用它。就像您对返回值所做的那样。但我不明白你为什么在那里使用指针。

标签: c segmentation-fault


【解决方案1】:

*returnSize = 2; 尝试将值 2 写入未初始化的指针(即内存地址)(即它包含一个不确定的值),这会导致段错误。相反,将resultSize 声明为常规的int(为其保留内存),然后将指向该int指针传递给函数:

int resultSize;
printf("First index:%d  \n", (twoSum(nums, size, 9, &resultSize))[0]);
printf("Second index:%d  \n", (twoSum(nums, size, 9, &resultSize))[1]);

您可能还希望将twoSum 返回的指针存储在main 函数中,以便在打印结果后释放它。

旁注:数学标题未使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 2011-06-26
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2022-07-13
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多