为什么这个代码在C崩溃? (带指针)

时间:2013-03-23 10:36:32

标签: c arrays pointers

这是我的C类练习,用户输入两个整数ab,我必须创建一个函数,返回一个包含ab之间所有整数的数组。 #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"); }

{{1}}

为什么这段代码会崩溃? (我认为这与免费(p)有关;但我不确定......)

3 个答案:

答案 0 :(得分:4)

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

您正在访问b - a + 2元素。但是你在{/ p>中分配了b - a + 1个元素

p=(int*)calloc(b-a+1,sizeof(int));

答案 1 :(得分:2)

以下循环遍历数组末尾:

 for(i=0;i<=b-a+1;i++)

答案 2 :(得分: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;
} 

此外,此功能根本不会更改指针本身。它只返回传递给它的指针。您写道,您“必须创建一个函数,该函数返回一个包含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;
}