-1

这是我的 C 类的一个练习,其中用户输入两个整数ab并且我必须创建一个函数,该函数返回一个数组,该数组包含 和 之间的所有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函数中循环的最后一次迭代arrayfromatob尝试访问p[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;
} 

此外,这个函数根本不会改变指针本身。它只是返回已传递给它的指针。您写道,您“必须创建一个函数,该函数返回一个包含a和之间所有整数的数组b,但是您的函数不会创建任何数组,它只是将值分配给传递给它的数组元素。

另请注意,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 回答