【问题标题】:Segmentation fault in return index返回索引中的分段错误
【发布时间】:2020-01-28 18:29:16
【问题描述】:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){

    int i = 0, j = 0;

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

我正在编写以下代码

给定nums = [2, 7, 11, 15]target = 9

因为nums[0] + nums[1] = 2 + 7 = 9, 返回[0, 1]

我尝试调试代码,i 和 j 值 0 和 1 符合预期。但是现在我在返回索引时遇到了这个问题。它显示为分段错误。谁能更正上面的代码?

【问题讨论】:

  • 使用gdb 运行您的程序,然后运行backtrace。它会告诉你它在哪一行发生了段错误。
  • return index 指令不可能出现段错误。您的代码看起来正确,没有问题。您需要在问题中添加minimal reproducible example。您的问题出在其他地方。
  • 你的代码没问题..你在其他地方有问题。 my solution
  • 我看到你使用NULL 作为返回值:stackoverflow.com/questions/59437282/…
  • @houssam 我刚刚看到了您的解决方案。但我没有明白将 malloc 类型转换为 void 的目的是什么。你能解释一下吗?

标签: c


【解决方案1】:

看起来像 codeforces 或类似的平台问题。发生分段错误是因为您没有设置调用者传递的returnSize,因为释放返回的数组需要相同的值。因此解决方案是将returnSize 设置为2。

【讨论】:

  • returnSize 仍未在函数内部使用。不过我会考虑删除。
  • @Muzol 我同意。但是,此代码将由在线法官判断,需要returnSize作为参数。这就是它应该如何工作的方式。
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
    int i = 0, j = 0;
    for(i=0; i < numsSize; i++)
    {
        for(j = i+1; j < numsSize; j++)
        {
            printf("i=%d j=%d \n",i,j);
            if(nums[j] == target - nums[i])
            {
                int *index = malloc(sizeof(int) * 2);
                index[0] = i;
                index[1] = j;
                return index;
            }
        }
    }
    return NULL;
}

int main()
{
    int nums[] = {2, 7, 11, 15}; // works
    //int * nums = {2, 7, 11, 15}; //compile OK (some compilers) but Segmentation fault .
    int target = 9;
    int * result = twoSum(nums,4,target,NULL);
    if(result)
        printf("result[0]=%d result[1]=%d" ,result[0] , result[1]);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2017-05-11
    相关资源
    最近更新 更多