【问题标题】:helper function using pointers使用指针的辅助函数
【发布时间】:2019-07-10 15:38:27
【问题描述】:

我正在尝试实现一个辅助函数,它对给定数组中的整数求和,然后使用指针更改主函数中的“array_sum”变量,而不是在帮助函数中返回整数。但是,我收到以下错误,“Segmentation Fault (core dumped)”任何帮助,我将不胜感激

void get_sum(int array[], int* array_sum)
{
    int length = sizeof(array)-1;
    int i = 0;
    for(i=0;i<length;i++){      
        *array_sum+= array[i];
    }   
}
main()
{
  int array_sum;
  int my_array[] = {25, 18, 6, 47, 2, 73, 100};

  get_sum(my_array, array_sum);

  printf("sum = %d", array_sum);

}

预期结果:

总和 = 271

实际结果:

分段错误(核心转储)

【问题讨论】:

  • 打开所有警告,并使用最近的编译器。例如。尝试在wandbox.org 上运行它。 (选择语言“C”、编译器“GCC”、一致性模式“C11”和“-pedantic-errors”。)
  • 除了下面给出的答案之外,您还需要将地址传递给get_sum(my_array, array_sum); 行中的变量array_sum,就像get_sum(my_array, &amp;array_sum); 一样

标签: c pointers


【解决方案1】:

函数get_sum 需要一个指向int 的指针作为第二个参数,但您传递的是int。你的编译器应该已经警告你了。

因此,array_sum 的当前值(不确定,因为它尚未初始化)被视为您的函数随后取消引用的指针值。取消引用无效指针(以及读取未初始化的值)会调用 undefined behavior,在这种情况下会导致崩溃。

您需要将array_sum地址 传递给函数。这为您提供了一个指向 int 的指针,该指针与函数所期望的匹配,因此您可以修改函数中的值。

get_sum(my_array, &array_sum);

另外,与此无关,get_sum 的以下内容不正确:

int length = sizeof(array)-1;

参数array实际上不是一个数组,而是一个指向数组第一个元素的指针。所以sizeof(array) 给你一个指针的大小。在这种特殊情况下,您可能会侥幸成功,因为假设您的系统上的指针是 8 个字节,length 被设置为 7,这恰好是数组 my_array 的元素数在main。如果您添加或删除元素,事情会突然中断。

处理此问题的正确方法是在main 中获取实际数组的大小并将其传递给您的函数。所以函数看起来像这样:

void get_sum(int array[], int* array_sum, int length)

你这样称呼它:

int my_array[] = {25, 18, 6, 47, 2, 73, 100};
int len = sizeof(my_array)/sizeof(my_array[0]);

get_sum(my_array, &array_sum, len);

【讨论】:

    【解决方案2】:

    当函数需要它的地址时,您正在按值传递array_sum。发生分段错误是因为您取消引用array_sum 的函数中的行将尝试将其值视为内存地址。

    此外,当数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针,从而丢失长度信息。 sizeof 在这种情况下不会给你数组的长度。

    您可以将“长度”参数传递给函数,也可以在数组末尾使用标记值来指示函数何时停止处理数组。前一种选择最省事。

    【讨论】:

      【解决方案3】:

      当作为参数传递给函数时,数组衰减到指向它的第一个元素的指针,在你的情况下

      sizeof(array) = sizeof(int*) = 8
      

      但我认为分段错误不是来自该行,因为 my_array 恰好有 7 个元素,并且在 get_sum 函数中计算的长度也是(巧合)7。 首先你需要初始化array_sum,并替换行

      get_sum(my_array, array_sum);
      

      通过

      get_sum(my_array, &array_sum);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-27
        • 2015-09-28
        • 2022-01-08
        • 2016-12-04
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多