我正在尝试实现一个对给定数组中的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
实际结果:
分段错误(核心已转储)
答案 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);