使用指针的辅助功能

时间:2019-02-16 20:09:54

标签: c pointers

我正在尝试实现一个对给定数组中的int求和的辅助函数,然后使用不在HELPER FUNCTION中返回int的指针来更改主函数中的“ array_sum”变量。但是,我收到以下错误消息:“分段错误(核心已转储)”,任何帮助我将不胜感激

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);

}

预期结果:

sum = 271

实际结果:

分段错误(核心已转储)

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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)为您提供了指针的大小。在这种 specific 情况下,您可能会避免使用它,因为假设系统上的指针为8个字节,length设置为7,恰好是数组{ my_array中的{1}}。如果添加或删除元素,事情会突然中断。

处理此问题的正确方法是在main中获取实际数组的大小并将其传递给函数。因此该函数将如下所示:

main

您这样称呼它:

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

答案 2 :(得分:0)

如果是数组,则作为参数传递给函数时指向其第一个元素的指针的数组衰减

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);