【问题标题】:Questions about a college project关于大学项目的问题
【发布时间】:2015-12-14 02:49:06
【问题描述】:

我有 结构:

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

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

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)))

这是我目前想到的,但我不能完全理解……所以:

  1. 我无法理解 *rentals 如何成为一个数组。我的意思是我不应该至少这样声明它:Rental *rentals[];?我知道如果我编译上面的代码我会看到一个错误...但是为什么呢?

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

  3. 假设我有对象rentals[0],它将是指向rentals 的指针。如果我想将结构传递给函数,我应该写: variable=function(*arguments*... , Rental *rentals[0]);?

【问题讨论】:

  • 不知道 C 库函数是阅读/理解每个正在使用的函数的手册页的好时机。在我的 ubuntu linux 14.04 上,使用代码时,我总是打开一个终端,所以我可以输入 man <functionName> 因为我发现我的“编辑”记忆并不完美,尤其是在记住所有细节时。

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


【解决方案1】:
  1. rentals 是一个指针,而不是一个数组,但它是一个指向 max_num 结构块的第一个(第零个)元素的指针,因此它可以被视为一个数组,因为您可以使用 rentals[n] 来引用数组的第 nth 元素。

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

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

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

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

    如果你想将一个指向结构的指针传递给函数,你可以这样写:

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

    或:

    variable = function(…args…, rentals);
    

    它们将相同的地址传递给函数。

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

【讨论】:

  • 感谢您的回复...我会测试您告诉我的内容,稍后我会用其他问题来打击您:D
【解决方案2】:

当您声明一个数组时(例如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 创建的任何内容一样,您必须使用@987654334自己也@它。

【讨论】:

  • 有人在最后几行编辑了我关于指向数组的指针的答案,从var = malloc( sizeof(var) *10 );var = malloc( 10 * sizeof(*var) );。我认为这是错误的,因为我想要一个指向struct mystructs 数组的指针,而不是指向struct mystructs 的指针。如果我错了,请纠正我。
  • 我相信编辑是正确的。您的var 是指向struct mystruct 的指针,*var 是实际的struct mystruct。无论哪种方式,您都可以改用sizeof(struct mystruct) 来消除所有混乱。
  • 您最初的陈述具有误导性:数组不是指针,尽管在许多情况下,数组的名称“衰减”为指向数组第一个元素的指针。
  • @AlexPogue 哦谢谢我看到了我的错误,sizeof (struct mystruct ) 实际上是我要输入的。我编辑了我的答案。
  • @mlp 感谢您的评论!我看到了我的错误并编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 2017-07-31
  • 1970-01-01
  • 2011-01-12
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多