使用calloc和数组并返回指针的麻烦

时间:2014-11-12 19:16:31

标签: c arrays pointers

作为参考,这是我的任务的第二部分:

  

int* generateFibonacci(int size);

     

此函数将输入一个称为size的整数作为输入。 size变量中包含的值   将表示Fibonacci序列中有多少数字放入数组中。功能   将使用calloc创建此大小的数组,然后使用size数字填充数组   Fibonacci序列,从11开始。当数组完成后,函数将返回a   指向它的指针。

当我在第8行“warning: assignment makes and integer from pointer without a cast”中收到错误时,我遇到了麻烦。 我得到的另一个错误是第19行“warning: return makes pointer from integer without a cast”。

所以我的问题是,我怎么想设置calloc来使用一个大小来自用户的数组,然后返回一个指向它的指针?

#include <stdio.h>
#include <stdlib.h>

int* generateFibonacci(int size)
{
  int i, array[size];

  array[size]=(int*)calloc(size, sizeof(int));

  array[0]=0;
  array[1]=1;

  for(i = 2; i < size+1; i++)

  array[i] = array[i-2] + array[i-1];

  return *array;
}

void printHistogram (int array[], int size)
{
  int i, j;

  for(i=0; i <= size; ++i)
  { 
    for(j=0; j < array[i]; j++)
    {
      printf("*");
    }
    printf("\n");
  }
}   

int main(void)
{
  int array[100], size;

  printf("how big will your Fibionacci number be? ");
  scanf("%i", &size);

  generateFibonacci(size);
  printHistogram(array, size);

  return 0;
}

1 个答案:

答案 0 :(得分:1)

我想如何设置calloc以使用来自用户的大小来生成数组,然后返回指向它的指针?

对于1D数组int *使用printf()scanf()

int *array = {0};
size_t size = 0;
printf("Enter order of array");
scanf("%d", &size);
array = malloc(size);//create memory with space for "size" elements
if(array){//do other stuff}

但是 目前还不清楚您的示例和评论是否真的打算使用2D数组....

如评论中所述,您创建了一个int数组,然后尝试为其创建内存。

int i, array[size];   
...   
array[size]=(int*)calloc(size, sizeof(int));//wrong

创建时,array不需要内存。内存在堆栈上自动创建 如果你想要一个int的2D数组。然后你可以这样做:

int  *array[size]; //create a pointer to int []  

有了这个,你可以用这种方式创建一个数组数组(概念上):

for(i=0;i<size;i++) array[i]= calloc(size, sizeof(int));//do not cast the output, not necessary  

现在,您基本上拥有size x sizeint的二维数组。可以通过以下方式为其指定值:

for(i=0;i<size;i++)
    for(j=0;j<size;j++)
        array[i][j]=i*j;//or some more useful assignment

顺便说一下,根据需要调整calloc()语句的参数, 但是注意 ,不需要输出其输出。

关于返回语句 ,您的函数原型化为返回int *

int* generateFibonacci(int size){...} //requires a return of int *  

如果你决定使用一维数组,即int *array={0}(要求你分配内存),那么返回:

return array;//array is already a `int *`, just return it.

如果您正在使用2D数组,那么要返回int *,您必须确定要返回的数组的size个元素:

return array[i];//where `i` can be any index value, from 0 to size-1