【问题标题】:Sum of two arrays两个数组的总和
【发布时间】:2011-12-18 21:04:14
【问题描述】:

练习说“用两个 int 数组和 k 参数创建一个函数,k 是它们的大小。该函数应该返回另一个数组(大小 k),其中每个元素都是相同位置的两个数组的总和。那就是我写的,但它崩溃了。我必须用指针来做吗?

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

void sumarray(int k,int A[k],int B[k]){
   int sum[k],i;
   for(i=0;i<k;i++){                
   sum[i]=A[i]+B[i];
   printf("sum[%d]=%d\n",i,sum[i]);}

 }



main(){
   int i,g,a[g],b[g];
   printf("Give size of both arrays: ");
   scanf("%d",&g);
   for(i=0;i<g;i++){
      a[i]=rand();
      b[i]=rand();
   }
   sumarray(g,a,b);
   system("pause");
}

示例:如果我有 A={1,2,3,4} 和 B={4,3,2,1},程序将返回 C={5,5,5,5)。

【问题讨论】:

  • 它在崩溃之前能走多远?
  • 什么是崩溃?错误信息是什么?输入什么?
  • ab应该是指针:int *a, *b,然后用malloccalloc初始化数组。
  • @Oli @David 它甚至没有开始。我得到一个黑屏,我得到一个错误消息,程序结束。

标签: c arrays sum


【解决方案1】:

这个:

int i,g,a[g],b[g];

导致未定义行为。 g 的值在初始化时是未定义的,因此 ab 的长度将是未定义的。

你可能想要这样的东西:

int i, g;
int *a;
int *b;  // Note: recommend declaring on separate lines, to avoid issues
scanf("%d", &g);
a = malloc(sizeof(*a) * g);
b = malloc(sizeof(*b) * g);
...
free(a);
free(b);

【讨论】:

  • 那我应该放什么?用户将给出数组的大小。
【解决方案2】:

动态获取g时,不可能先做a[g]

您在 main 中的第一行应该是:

int i,g;
int *a,*b;
printf("Give size of both arrays: ");
scanf("%d",&g);
a = (int *)malloc(g*sizeof(int));
b = (int *)malloc(g*sizeof(int));

【讨论】:

    【解决方案3】:
    int sum[k] ;
    

    k 是一个变量,但数组的大小应该是一个常数。

    函数应该返回另一个数组(大小为 k)...

    但是你写的函数返回void,这显然是错误的。

    我必须用指针来做吗?

    是的。

    【讨论】:

      【解决方案4】:

      一个问题是您试图在堆栈上声明动态大小的数组(例如a[g])。您需要为每个数组声明指针,然后在读取 g 的值后动态分配可变大小的数组。

      【讨论】:

      • 我应该先做类似 'a[l]' 然后 'g=&l' 的事情吗?我不太擅长指针。
      • 在 C99 中,可以在读入 g 之后声明可变长度数组。但是对于通用 C,那么是的,这就是你应该做的。
      【解决方案5】:

      将函数摘要签名(声明的定义部分)更改为此并尝试一下:

      void sumarray(int k,int* A,int* B){

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多