-2

セグメンテーション違反エラーが発生します。誰でも理由を教えてもらえますか?

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

       char sumArrays(int * arr1[], int * arr2[], int length, int count){
       if(count == length){
           return ' ';
       }
       else{
          int sum = 0;
       sum =  *arr1[count] + *arr2[count];
       char ch = '            
       ch = ch + (char)sum;
       return ch + sumArrays(arr1, arr2, length, count+1);
    }
  }

int main(int argc, char * arr[]){
    int length = 6;
    printf("Enter the first row of 6 integers:");
    int * arr1 = malloc(length * sizeof(int));
    int * arr2 = malloc(length * sizeof(int));
    int counter = 0;
    int number = 0;
    while(counter < length){
       scanf("%d", &number);
       arr1[counter]=number;
       counter++;
    }
    counter = 0;
    printf("Enter the second row of 6 integers:");
    while(counter < length){
      scanf("%d", &number);
      arr2[counter] = number;
      counter++;
    }
    char sum = sumArrays(&arr1, &arr2, length, 1);
    free(arr1);
    free(arr2);
    printf("Their sums are : %c ", sum);
    return 0;
  }      

私は C を初めて使用し、言語についてあまり知りません。Java でプログラムを作成し、動作させることができました。どんな助けでも大歓迎です!

ありがとうございました!

編集: セグメンテーション エラーは修正されましたが、現在は合計の実際の文字が出力されません....

4

2 に答える 2

1

これは、「&array がポインターの配列を作成しない」の別のケースです。

これはポインターの配列です。

 int * arr1[]

これにより、整数の配列へのポインターが作成されます。

&arr1     // That is, one pointer to your array of integers. 

そのため、count > 0 でこれにアクセスすると、コンパイラは指定されていないポインター値を読み取ろうとします。

*arr1[count]

修正は、あちこちの星と他の場所の & を削除することです。

削除する*

   char sumArrays(int * arr1[], int * arr2[], int length, int count){
   sum =  *arr1[count] + *arr2[count];

削除する &:

char sum = sumArrays(&arr1, &arr2, length, 1);

私も個人的にこれを変更します:

int length = 6;
int * arr1 = malloc(length * sizeof(int));
int * arr2 = malloc(length * sizeof(int));

に:

const int length = 6;
int arr1[length];
int arr2[length];

一番下のフォーを取り除きfree(arr1); free(arr2)ます。配列がかなり大きくなるまで配列を割り当てる必要はありません。数百の整数で十分です。

于 2013-01-24T00:19:28.693 に答える
0

この行で:

sum =  *arr1[count] + *arr2[count];

間違った順序で第 2 レベルのポインターを逆参照しています。正しいものは次のとおりです。

sum =  (*arr1)[count] + (*arr2)[count];

しかし、本当の答えは次のとおりです。 のアドレスを取得する必要はありませんarr1。sumArrays 宣言を次のように変更します。

char sumArrays(int arr1[], int arr2[], int length, int count)
于 2013-01-24T00:18:33.117 に答える