使用指针将数组传递给函数

时间:2014-02-21 17:06:31

标签: c arrays pointers

请帮助修复此程序。我尝试使用指针而不是数组打印指针数组但我收到此错误:

enter number of element:5
array[0]=1
array[1]=2
array[2]=3
array[3]=4
array[4]=5
Segmentation fault

这是代码:

#include <stdio.h>
#include <stdlib.h>

int *array;
int n;

void input(int *array,int n);
void display(int *array,int n);
int sum(int *array,int n);

int main (void) {
   int result;
   printf("enter number of element:");scanf("%d",&n);
   input(array,n);  
   display(array,n);
   result=sum(array,n);
   printf("sum of array=%d",result);
   return 0;
}

void input(int *array,int n){
   int j;
   array=(int *)malloc(n*sizeof(int));
   for(j=0;j<n;j++){
        printf("array[%d]=",j);scanf("%d",array+j);
   }
}

void display(int *array,int n){
    int j;

    for(j=0;j<n;j++){
        printf("%d\t",*(array+j));
   }
    printf("\n");
}

 int sum(int *array,int n){
     int sum=0,j;

     for(j=0;j<n;j++){
       sum+=*array+j;
    }
    return sum;
}

我该如何修复此代码?请有人解释一下该代码有什么问题

5 个答案:

答案 0 :(得分:3)

变量array是函数input中的局部变量。

因此,使用array = ...设置它是没有意义的,因为此赋值仅在内部函数中生效。您通常应将其地址(&array)传递给任何需要更改它的函数。

在您的特定示例中,您还有一个全局变量array,因此快速解决您的问题的方法是简单地调用函数input而不传递变量array作为参数:

void input(int n)
{
    ...
    array = (int*)malloc(n*sizeof(int));
    ...
}

int main()
{
    ...
    input(n);
    ...
}

请注意,这是一个“脏”的解决方法,您通常应该努力避免使用全局变量。

答案 1 :(得分:1)

将简洁版本添加到barak's answer

int input(int ** array, const size_t n)
{
  int result = 0;

  assert(NULL != array);

  (*array) = malloc(n * sizeof(**array));
  if (NULL == (*array))
  {
    result = -1;
  }
  else
  {
    size_t j;
    for(j = 0; j < n; ++j)
    {
      printf("array[%zu]=", j);
      scanf("%d", (*array) + j); /* still missing error checking here . */
    }
  }

  return result;
}

并称之为:

if (-1 == input(&array, n))
{
  perror("input() failed");
  exit(EXIT_FAILURE);
}

答案 2 :(得分:0)

试试这个input()

void input(int **array,int n){
   int j;
   *array=(int *)malloc(n*sizeof(int));
   for(j=0;j<n;j++){
        printf("array[%d]=",j);scanf("%d",*array+j);
   }
}

因为C使用pass-by-value,如果要更改函数中变量的值,则需要将该变量的地址作为参数传递给该函数。

在这种情况下,您希望更改arrayinput()的值,array的类型为int *,因此input()的原型应该是void input (int **array, ...)

答案 3 :(得分:0)

* array + j有什么作用?它评估*数组并添加j吗?或者它是否将j添加到数组然后取消引用它?如果我告诉你你错了,你会愿意下注100美元吗?

通过使用括号,甚至更好地编写数组[j],让您的生活和任何人阅读代码的生活变得更轻松。

答案 4 :(得分:0)

这应该做..确保你明白别人说了什么..

#include <stdio.h>
#include <stdlib.h>

int *array;
int n;


void input(int **array,int n);
void display(int **array,int n);
int sum(int **array,int n);

int main (void) {
int result;
printf("enter number of element:");scanf("%d",&n);
input(&array,n);
display(&array,n);
result = sum(&array,n);
printf("sum of array= %d",result);
return 0;
}

void input(int **array,int n){
int j;
*array= malloc(n*sizeof(int));
for(j=0;j<n;j++){
    printf("array[%d]=",j);
    scanf("%d",(*array)+j);
}
}

void display(int **array,int n){
int j;

for(j=0;j<n;j++){
    printf("%d\t",*((*array)+j)); // you can use array notation aswell
                                   //array[0][j] will work
}
printf("\n");
}

int sum(int **array,int n){
int sum=0,j;

for(j=0;j<n;j++){
    sum += *((*array)+j);
}
return sum;
}