返回一个包含a到b的所有整数的数组

cap*_*ain 10 c arrays

练习说"创建一个带有两个参数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.问题出在哪里?谢谢

Lig*_*ica 7

对于初学者

如果您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)确实允许这样做(并且不清楚你是否启用了该扩展和/或允许在你的作业中使用它 - 我会假设这个答案是你没有/是不)时,语言本身并没有允许用动态大小的阵列.

动态大小是什么意思?

我的意思是变量ab依赖于用户输入:它们在编译时是未知的.通常,必须在编译时知道数组的大小.

注意:如果您使用此代码,您的代码可能会编译而不会出现错误,您的程序甚至可能会运行并正常工作.但是,您将依赖于所谓的"未定义行为",并且由于任意数量的随机,不可预测的因素,您的代码可能会随时停止运行甚至崩溃.即使它看起来没问题,也是无效的.不要这样做!

幸运的,如果在程序运行之前不知道元素,有一种方法可以为元素分配一个具有正确大小的内存块.它被称为"动态分配",它涉及一个函数调用:

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上生锈了,所以完成的代码可能会有一些语法错误.

希望这可以帮助!

  • @DShook:这是Stack Overflow,而不是课后班.每个人都有他们的教学方式,这是我的.有些人通过榜样学得最好.我们可能永远不会同意这个问题.:) (3认同)