这是我的C类练习,用户输入两个整数a
和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");
}
:
{{1}}
为什么这段代码会崩溃? (我认为这与免费(p)有关;但我不确定......)
答案 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;
}
此外,此功能根本不会更改指针本身。它只返回传递给它的指针。您写道,您“必须创建一个函数,该函数返回一个包含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;
}