-1

これは、ユーザーが 2 つの整数aとを入力する C クラスの演習です。bと の間のすべての整数を含む配列を返す関数を作成する必要がありaますb

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

int* arrayfromatob(int a,int b,int *p)
{
     int i;
     for(i=0;i<=b-a+1;i++)
            p[i]=a+i;
     return p;
} 

main()
{
      int a,b,*p,i,temp;
      puts("Give two integers:");
      scanf("%d %d",&a,&b);
      if(b<a)
      {
             temp=a;
             a=b;
             b=temp;
      }
      p=(int*)calloc(b-a+1,sizeof(int));
      if(p==NULL)
      {
                 puts("Could not allocate memory");
                 exit(1);
      }
      p=arrayfromatob(a,b,p);
      for(i=0;i<b-a+1;i++)
                printf("Number %d: %d\n",i+1,p[i]);
      free(p);
      system("pause");
}

このコードがクラッシュするのはなぜですか? ( free(p); に関係していると思いますが、よくわかりません...)

4

3 に答える 3

4
    for(i=0;i<=b-a+1;i++)
        p[i]=a+i;

要素にアクセスしb - a + 2ています。b - a + 1しかし、要素を次の場所に割り当てました:

p=(int*)calloc(b-a+1,sizeof(int));
于 2013-03-23T10:39:13.687 に答える
2

次のループは、配列の末尾を超えてループします。

 for(i=0;i<=b-a+1;i++)
于 2013-03-23T10:39:36.500 に答える
1

関数for内のループの最後の反復はにアクセスしようとしますが、これは範囲外であるため、未定義の動作が発生します。arrayfromatobp[b-a+1]

int* arrayfromatob(int a,int b,int *p)
{
    int i;
    for(i=0;i<=b-a+1;i++)   // <-- b-a+2 iterations
        p[i]=a+i;
    return p;
} 

さらに、この関数はポインター自体をまったく変更しません。渡されたポインタを返すだけです。「 ~ の間のすべての整数を含む配列を返す関数を作成する必要がある」と書きabましたが、関数は配列を作成せず、渡された配列の要素に値を割り当てるだけです。

また、割り当てられたメモリをゼロで初期化することにも注意してcallocください。とにかく書き換えます。ここではシンプルmallocで十分です。これは、関数が実際にどのように見えるかです:

// returns the pointer to the newly-created array
// caller should free() this pointer when he's done with it
int* arrayfromatob(int a, int b)
{
    int i, size;
    size = b - a + 1;
    int* p = malloc(size * sizeof(int));
    for (i = 0; i < size; i++)
        p[i] = a + i;
    return p;
} 
于 2013-03-23T10:47:39.780 に答える