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

时间:2011-04-11 21:17:16

标签: 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");
}

问题在于,如果我举例如c = 2且d = 5,程序会返回类似2088806975 16384 1 2293536而不是2 3 4 5.问题出在哪里?感谢

9 个答案:

答案 0 :(得分:7)

对于初学者

如果您的main()返回类型为int,请不要忘记return中的值!

int main(void)
{
   /* code here */

   return 0;
}

问题1

通过

d[k]=i;
k++;
printf("%d ", d[k]);

我认为你的意思是

d[k]=i;
printf("%d ", d[k]);
k++;

否则你每次都打印“next”数组元素,这将是最后一次循环迭代中数组的结尾。

问题2

int i,k=0,d[k];

你创建一个大小为d的数组k k为0.我认为你打算在编写k++时自动调整数组大小,但这是不是这样的。数组是用零元素创建的,然后就是它的大小。

你的下一个本能可能是首先创建足够大的数组:

int d[b-a+1];

不幸的是,这也很可能是错误的。它依赖于称为可变长度数组(或“VLA”)的功能;虽然GCC编译器扩展(以及顺便提一下,C99)确实允许这样做(并且不清楚你是否启用了该扩展和/或允许在你的作业中使用它 - 我会假设你做了这个答案不是/不是),语言本身允许具有动态大小的数组。

动态尺寸是什么意思?

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

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

<强>解决方案

幸运的是, 是一种为元素分配内存块的方法,当你在程序运行之前不知道元素时。它被称为“动态分配”,它涉及函数调用:

int *d = malloc(sizeof(int) * (b-a+1));

您可以使用相同的语法(d[k])访问此“数组”或内存块中的“元素”,但您必须稍后手动释放内存:

free(d);

可能的问题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;
}

免责声明:我在C上生锈了,所以完成的代码可能会有一些语法错误。

希望这有帮助!

答案 1 :(得分:3)

d的大小始终为0.因为您将其初始化为d[k]。您应该执行d[b-a+1]之类的操作。

更新

此外,您的陈述顺序错误,请参阅pmg的回答。

更新2:

您的代码实际上并不返回您正在创建的数组,除非您在堆上创建数组(即使用malloc / free),否则它将无法工作。

答案 2 :(得分:2)

陈述的顺序不正确

  d[k]=i;                          // d[0] = 42;
  k++;                             // ...
  printf("%d ",d[k]);              // print d[1]

答案 3 :(得分:2)

首先需要为数组分配内存,使用malloc和你需要分配的整数量

另外,为了对问题语句忠实,让函数返回一个指向数组的指针,这样主函数就可以打印出来而不是直接执行它的exec函数。

答案 4 :(得分:2)

做一些人的家庭作业总是有点糟糕,但显然OP不知道如何解决这个特殊的问题所以这里是动态内存分配的一个完整的例子(过度评论)。

#include <stdio.h>
#include <stdlib.h> /* required for malloc() and free() */

/* function that retuns a pointer to int type of data */
int *create_array(int a, int b)
{
    int *array;
    int array_size = b - a + 1; /* assuming that 'a' is always smaller than 'b' */
    int i;

    array = malloc( array_size * sizeof(int) ); /* allocate memory for the array */
    if(array == NULL) exit(EXIT_FAILURE); /* bail out if allocation fails */

    /* assign the values into array */
    for(i = 0; i < array_size; ++i)
        array[i] = a++;

    /* return a pointer to our allocated array */
    return array;
}

int main(void)
{
    int *array;
    int i, a = 42, b = 50;

    /* and now we can call the function to create the array */
    array = create_array(a, b);

    /* print results */
    for(i = 0; i < b - a + 1; ++i)
        printf("%d\n", array[i]);

    /* always remember to free the data after you are done with it */
    free(array); 

    return 0;
}

答案 5 :(得分:1)

您在代码中错误地声明了d数组:

int d[k];

应该是:

int d[b-a+1];

修改

此外,正如其他人发布的那样,声明顺序错误:

d[k]=i;
k++;
printf("%d ",d[k]);

应该是:

d[k]=i;
printf("%d ",d[k]);
k++;

因为否则你会在k==0时“失去”第一个值。

答案 6 :(得分:0)

你创建了一个大小为零的数组,然后开始抛出数据而不调整数组大小。我有点意外,你没有收到错误。

您在定义的数据存储安全之外访问内存中的数据。它应该是一个错误,因为结果没有定义。超过数组末尾的数据可用于任何事情。由于你的数组大小为零,所以一切都已经过了。

答案 7 :(得分:0)

有几个问题。首先,d未返回exc。当然,你不应该只是返回它,因为它是在堆栈上分配的。其次,在printf增加后调用k。这将打印d中的下一个元素,而不是您刚刚填写的值。最后,d没有为其分配任何空间,因为k在{时始终为0} {1}}已创建。

答案 8 :(得分:-1)

这是因为您在堆栈上为d分配内存。如果你将它的声明移到函数之外,一切都应该没问题。