C 使用指针的helper函数
我试图实现一个helper函数,它对给定数组中的整数求和,然后使用指针在helper函数中不返回整数来更改主函数中的“array_sum”变量。然而,我得到以下错误,“分割错误(核心转储)”任何帮助我将不胜感激C 使用指针的helper函数,c,pointers,C,Pointers,我试图实现一个helper函数,它对给定数组中的整数求和,然后使用指针在helper函数中不返回整数来更改主函数中的“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_
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);
}
void get_sum(int数组[],int*数组_sum)
{
int length=sizeof(数组)-1;
int i=0;
对于(i=0;i当函数期望其地址时,您正在按值传递array\u sum
。发生分段错误的原因是,函数中取消引用array\u sum
的行将尝试将其值视为内存地址
此外,当数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针,从而丢失长度信息。sizeof
在这种情况下不会给出数组的长度
您可以传递“长度”函数的参数,或者在数组末尾使用sentinel值来指示函数何时停止处理数组。前一个选项最简单。函数get\u sum
要求第二个参数有一个指向int
的指针,但您传递的是int
应该警告你的
因此,数组_sum
的当前值(由于尚未初始化而不确定)被视为一个指针值,您的函数随后会取消引用该值。取消引用无效指针(以及读取未初始化的值)会调用该值,在这种情况下会导致崩溃
您需要将array\u sum
的地址传递给函数。这将为您提供一个指向int
的指针,该指针与函数期望的值相匹配,以便您可以修改函数中的值
get_sum(my_array, &array_sum);
此外,与此无关的是,get\u sum
中的以下内容不正确:
int length = sizeof(array)-1;
参数array
实际上不是数组,而是指向数组第一个元素的指针
为您提供指针的大小。在这种特殊情况下,您可能不会受到影响,因为假设系统中的指针为8字节,length
被设置为7,这恰好是main
中数组my_array
的元素数。如果添加或删除元素,则会突然中断
正确的处理方法是在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);
你这样称呼它:
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);
在这种情况下,数组衰减到作为参数传递给函数时指向其第一个元素的指针
sizeof(array) = sizeof(int*) = 8
但是我认为分割错误不是来自那条线,因为我的数组正好有7个元素,在get_sum函数中计算的长度也是(巧合)7。
首先,您需要初始化数组_sum,并替换该行
get_sum(my_array, array_sum);
借
打开所有警告,并使用最新的编译器。例如,尝试运行此编译器。(选择语言“C”、编译器“GCC”、一致性模式“C11”和“-pedantic errors”。)除下面给出的答案外,可能存在重复的。您需要将地址传递给变量
数组\u sum
第行获取\u sum(my\u array,array\u sum)
像这样get_sum(my_array,&array_sum);