练习说"创建一个带有两个参数a和b的函数,它们是整数,函数将返回一个整数数组,每个数字从a到b.
#include <stdio.h>
#include <stdlib.h>
void exc(int a, int b){
int i,k=0,d[k];
for(i=a;i<=b;i++){
d[k]=i;
k++;
printf("%d ",d[k]);
}
}
int main(void){
int c,d;
printf("Give first integer: ");
scanf("%d",&c);
printf("Give second integer: ");
scanf("%d",&d);
exc(c,d);
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我把例如c = 2和d = 5,程序返回类似2088806975 16384 1 2293536而不是2 3 4 5.问题出在哪里?谢谢
对于初学者
如果您main()
有返回类型int
,请不要忘记return
它的值!
int main(void)
{
/* code here */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题1
通过
d[k]=i;
k++;
printf("%d ", d[k]);
Run Code Online (Sandbox Code Playgroud)
我想你的意思
d[k]=i;
printf("%d ", d[k]);
k++;
Run Code Online (Sandbox Code Playgroud)
否则你每次打印"下一个"数组元素,这将是最后一次循环迭代中数组的一个结束.
问题2
int i,k=0,d[k];
Run Code Online (Sandbox Code Playgroud)
你让一个数组d
大小的k
地方k
是0,我认为你打算数组当你写自动调整k++
,但这种情况并非如此.使用零元素创建数组,然后这是它的大小.
你的下一个本能可能是在第一时间创建足够大的数组:
int d[b-a+1];
Run Code Online (Sandbox Code Playgroud)
不幸的是,这也很可能是错误的.它依赖于称为可变长度数组(或"VLA")的功能; 虽然GCC编译器扩展(以及顺便说一下,C99)确实允许这样做(并且不清楚你是否启用了该扩展和/或允许在你的作业中使用它 - 我会假设这个答案是你没有/是不)时,语言本身并没有允许用动态大小的阵列.
动态大小是什么意思?
我的意思是变量a
并b
依赖于用户输入:它们在编译时是未知的.通常,必须在编译时知道数组的大小.
注意:如果您使用此代码,您的代码可能会编译而不会出现错误,您的程序甚至可能会运行并正常工作.但是,您将依赖于所谓的"未定义行为",并且由于任意数量的随机,不可预测的因素,您的代码可能会随时停止运行甚至崩溃.即使它看起来没问题,也是无效的.不要这样做!
解
幸运的是,如果在程序运行之前不知道元素,有一种方法可以为元素分配一个具有正确大小的内存块.它被称为"动态分配",它涉及一个函数调用:
int *d = malloc(sizeof(int) * (b-a+1));
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的语法(d[k]
)来访问此"数组"或内存块中的"元素",但您必须稍后手动释放内存:
free(d);
Run Code Online (Sandbox Code Playgroud)
可能的问题3
你的任务是从函数返回一个数组,但你不是这样做的.相反,你只是在同一个函数中创建,填充和打印数组(这似乎有点无意义).
你实际上也不能返回一个数组,但是因为你正在为它动态分配空间,所以你有一个可以使用的指针.我认为你的老师可能希望你返回一个指向这个数组的指针.
如果是这样,完成的代码看起来有点像这样:
#include <stdio.h>
#include <stdlib.h>
int *exc(int a, int b)
{
int i, k = 0;
int *d = malloc(sizeof(int) * ((b-a)+1));
for (i=a; i<=b; i++) {
d[k]=i;
k++;
}
return d;
}
int main(void)
{
int a,b,i,*ar;
printf("Give first integer: ");
scanf("%d",&a);
printf("Give second integer: ");
scanf("%d",&b);
ar = exc(a,b);
for (i=0; i < (b-a+1); i++) {
printf("%d ", ar[i]);
}
free(ar);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
免责声明:我在C上生锈了,所以完成的代码可能会有一些语法错误.
希望这可以帮助!
归档时间: |
|
查看次数: |
808 次 |
最近记录: |