【问题标题】:Source code using a structure pointer使用结构指针的源代码
【发布时间】:2015-03-10 07:35:44
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()    
{    
struct stock     {     
    char symbol[5];     
    int quantity;    
    float price;    
};    
struct stock *invest;

/*Create structure in memory */
invest=(struct stock *)malloc(sizeof(struct stock));
if(invest==NULL)
{
    puts("Some kind of malloc() error");
    exit(1);
}
/*Assign structure data */
strcpy(invest->symbol,"GOOG");
invest->quantity=100;
invest->price=801.19;

/*Display database */
puts("Investment portfolio");
printf("Symbol\tShares\tPrice\tValue\n");
printf("%-6s\t%5d\t%.2f\t%%.2f\n",\
       invest->symbol,
       invest->quantity,
       invest->price,
       invest->quantity*invest->price);         /*  I dont understand this line */

       return(0);

}
  • 在最终输出中

符号 - GOOG
分享 -100
价格 - 801.19
值 - %.2f

  • line33 处的最终指针引用如何导致输出 %.2f ?
    (我确实理解 %% 用于显示 %]

  • 为什么要在程序中重新分配内存?

假设,如果我在代码中为 invest 指针添加一个realloc() 函数,它将如何影响程序或使其在性能方面更好?
realloc() 如何帮助“释放”内存?

(我不太明白realloc()malloc()的关系)

【问题讨论】:

  • 我明白 %% 用于显示 %。这就是%%.2f 输出%.2f 的原因。
  • 另请注意:您似乎在编译时没有警告。 invest-&gt;price=801.19 应该发出缩小警告。 801.19 是一个 double 文字,它被填充到 float 值中(尝试 801.19f)。
  • 我使用code::blocks,我可能需要在其中更改编译器的设置。它有时不会对旨在为初学者显示警告的代码显示警告。帮助不大?
  • 关于casting the result of malloc的必填链接。现在我真正想知道的是,那些一直教初学者这样做的白痴是谁?

标签: c pointers struct malloc realloc


【解决方案1】:

%%.2f 需要一个额外的 % 符号来使最终的 .2f 变成一种格式,而不是显示的字符串文字。

其次,realloc 旨在调整内存中先前 calloc-ed 数组的大小。

【讨论】:

    【解决方案2】:

    line33 处的最终指针引用如何导致输出 %.2f ?

    因为%% 导致 printf 显示 % 符号,而不将第二个 % 视为格式说明符的开头。剩下的 .2f 只是 printf 术语中的文字字符,需要逐字打印。

    为什么要在程序中重新分配内存?

    realloc 用于更改先前 malloc 的内存区域的大小,同时尽可能多地保留其中的数据。在您的情况下,您分配了足够的内存来存储struct stock 的一个实例。如果你决定要两个实例,你可以这样做:

    invest = realloc(sizeof(struct stock) * 2);
    

    这几乎等同于

    struct stock* newInvest = malloc(sizeof(struct stock) * 2);
    memcpy(newInvest, invest, sizeof(struct stock));
    free(invest);
    invest = newInvest;
    

    不同之处在于realloc 可以检查原始内存块是否可以扩展,这比分配新块、复制数据和释放旧块要快得多。

    我不明白这一行

    invest->quantity*invest->price); 
    

    这只是一个将数量和价格相乘的表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2021-06-15
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多