关于大学项目的问题

时间:2015-12-14 02:49:06

标签: c struct dynamic-memory-allocation double-pointer

我有 结构:

bN -> Nbbb

通过动态分配的指针数组(这里是项目的一部分)存储和访问不同的-Rental类型结构:

typedef struct Rental {
  int nDays;
  float kmsDriven;
  char carLicensePlate[LICENSE_PLATE_LENGTH+1];
  char *clientName;
  char chargingCategory;
} Rental;

这是我到目前为止所想到的,但我完全无法理解......所以:

  1. 我无法理解int main (){ Rental *rentals; int max_num; printf("Give a number of rentals you would like to store and manage: "); scanf("%d", &max_num); rentals=(Rentals *)malloc(max_num * (sizeof(Rental))) 如何成为一个数组。我的意思是我不应该至少以这种方式声明它:*rentals?我知道如果我编译上面的代码,我会看到一个错误...但为什么?

  2. 我在Stack Overflow中阅读了很多关于使用双指针(Rental *rentals[];)执行此操作的帖子,但其他人发布的代码通常很难让我阅读(我不知道)所有功能等。)

  3. 假设我有一个对象Rental **rentals;,它将指向rentals[0]。如果我想将结构传递给函数,我应该写: rentals

2 个答案:

答案 0 :(得分:1)

  1. rentals是一个指针,而不是一个数组,但它是一个指向max_num结构块的第一个(第零个)元素的指针,因此它可以被视为一个数组因为你可以使用rentals[n]来引用数组的n th 元素。

  2. 这不是一个问题,因此无法回答。

  3.   
        
    1. 我们说我有一个对象rentals[0],它将指向rentals。如果我想将结构传递给函数,我应该写:variable=function(*arguments*... , Rental *rentals[0]);
    2.   
    • rentals[0]不是指针;它是struct RentalRental

    • 如果要将结构传递给函数,请编写:

      variable = function(…args…, rentals[0]);
      

      如果要将指向结构的指针传递给函数,请编写:

      variable = function(…args…, &rentals[0]);
      

      或:

      variable = function(…args…, rentals);
      

      这些将相同的地址传递给函数。

    您应该错误地检查对scanf()的调用以确保您有一个号码,并且您应该错误检查您获得的号码(它应该是严格正数,而不是零或负数),您应该出错检查malloc()返回的值。

答案 1 :(得分:0)

当你声明一个数组时(例如char buffer[10];,变量实际上指向那个数组。指针和数组非常接近。实际上当你有一个存储数据数组的指针时(就像您使用malloc}的情况下,您可以执行pointer[0]pointer[1]之类的操作来获取正确的元素。

使用指针访问元素时,您通常会使用*(pointer +1)来获取位置1上的元素,这与pointer[1]完全相同。

如果要在数组中传递struct,可以按照这样的值给出:

void function(struct mystruct var)
{
    //...
}

int main()
{
    struct mystruct var;
    function(var);
}

或通过引用(传递地址而不是数据 - 如果您的结构体积很大,这是理想的):

void function(struct mystruct *var)
{
    //...
}

int main()
{
    struct mystruct var;
    function(&var);
}

通过使用数组,您可以这样做(仍然通过引用):

void function(struct mystruct *var)
{
    //...
}

int main()
{
    struct mystruct var[10];
    function(&var[0]);
}

使用指针(指向数组):

void function(struct mystruct *var)
{
    //...
}

int main()
{
    struct mystruct *var;
    var = malloc( sizeof(struct mystruct) *10 );

    //This will pass the address of the whole array (from position 0)
    function(&var);

    //This will pass the address of the selected element
    function(&var[0]);
}

正如您所看到的,声明一个数组或一个指针几乎是相同的,期望您必须自己初始化指针数组(使用malloc)以及使用malloc创建的任何内容也必须自己free