在运行时创建一个数组并将其传递给C中的函数?

时间:2014-03-22 21:04:54

标签: c arrays pointers runtime

我在main()函数中从用户那里获得了一些输入并相应地创建了一个数组。由于该数组位置的性质,其他函数不可见,我需要将其传递给其他一些函数进行处理。

有没有办法在不为它分配内存并将指针传递给分配的内存的情况下执行此操作? 航班是结构类型。

int main()
{
    do{ // Read # of flights from user
        printf("Enter max number of flights to read in from file\n");
        printf("--> ");
        fflush(stdin);
    } while(!(scanf("%d",&num_of_flights)));

    flight database[num_of_flights];      // Create database for flights

3 个答案:

答案 0 :(得分:0)

在C中,您可以在运行时以这种方式分配内存

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

void print_array(int *array, int array_size){
  for(int i = 0;  i < array_size; ++i){
    printf("%d ", *(array + i));
  }
}
int main(){
  int *array;
  int array_size;
  scanf("%d", &array_size);
  array = malloc(sizeof(int) * array_size);
  // Fill array with ints
  for(int i = 0; i < array_size; i++){
    *(array + i) = i;
  }

  print_array(array, array_size);
  return 0;
}

答案 1 :(得分:0)

根据C标准,6.2.4对象的存储持续时间:

  

对象的生命周期是程序执行期间的一部分   保证保留哪个存储空间。存在一个对象,   有一个常量地址)并保留其最后存储的值   一生......   声明标识符没有链接且没有链接的对象   存储级指定静态具有自动存储持续时间...   对于没有可变长度数组类型的对象,   它的生命周期从进入到它所在的区块延伸   关联,直到该块的执行以任何方式结束。

因此,database的生命周期延长,直到其封闭块的执行结束。该块是main的主体,因此它在main返回或程序退出之前一直存在。因此,您可以简单地将database传递给其他函数,甚至将其地址存储在其他函数访问的全局中......不需要分配空间并复制它。

顺便说一句,你应该知道,通过定义database[num_of_flights],其中num_of_flights不是常量,你正在使用C - 变量长度数组(VLA)的一个相对较新的特征 - 并且一些着名的C编译器(咳嗽,Visual Studio,咳嗽)不支持它们。

答案 2 :(得分:0)

这显示了如何在结构上使用malloc,然后将malloc&quot; d项用作其他函数的参数

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

struct fl {
    int distance;
    char aeroplane[30];
    char startgeo[2];
};
typedef struct fl flight;

void show_flight_data(flight d) {
    printf("distance %d aeroplane %s",d.distance, d.aeroplane);
}

int main()
{
    int num_of_flights;
    flight *database;

    do{ // Read # of flights from user
        printf("Enter max number of flights to read in from file\n");
        printf("--> ");
        fflush(stdin);
    } while(!(scanf("%d",&num_of_flights)));

    database=(flight *)malloc(sizeof(flight) * num_of_flights);
    database[0].distance = 100;
    database[1].distance = 200;
    strcpy(database[0].aeroplane,  "777");
    strcpy(database[1].aeroplane,  "Airbus");
    show_flight_data(database[0]);
    return(0);
}