使用结构指针的源代码

Source code using a structure pointer

#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

假设,如果我要在代码中为 invest 指针添加一个 realloc() 函数,它将如何影响程序或使其更好性能方面?
realloc() 如何帮助 'freeing' 记忆?

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

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

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

How is the final pointer reference at line33 leading to the output %.2f ?

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

Why exactly is memory reallocated in a program?

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可以检查原来的内存块,看看它是否可以扩展,这比分配新块、复制数据和释放旧块要快得多。

I dont understand this line

invest->quantity*invest->price); 

这只是一个数量乘以价格的表达式。