Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针的helper函数_C_Pointers - Fatal编程技术网

C 使用指针的helper函数

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_

我试图实现一个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_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);