gpt4 book ai didi

c - 在 C 中使用 malloc() 或 realloc() 存储并打印数据

转载 作者:行者123 更新时间:2023-11-30 20:40:43 25 4
gpt4 key购买 nike

有人可以告诉我代码有什么问题吗?抱歉,如果我是新手,但我长期以来一直在努力解决这个问题。我试图从用户那里获取输入,然后打印这些值。以下代码只是一个示例。

我尝试运行代码,但出现运行时错误。有人可以帮忙吗?

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

typedef struct poly
{
int kill;
float bill;
char katana[50];
} koly;
typedef koly* terma;

int main()
{
int count = 0;
terma ren;
ren = (terma)malloc(sizeof(koly));
ren = (terma)realloc(6*sizeof(koly));
printf("We can store now:\n\n");
while(++count<= 2)
{
scanf("%d",ren->kill);
scanf("%f",ren->bill);
scanf("%s",ren->katana);
}
while(++count<= 2)
{
printf("\n%d\n",ren->kill);
printf("\n%f\n",ren->bill);
printf("\n%s\n",ren->katana);
}
}

最佳答案

关于您的错误:

scanf("%d",ren->kill);
scanf("%f",ren->bill);

这些应该是指针,所以更正的版本是:

scanf("%d",&ren->kill);
scanf("%f",&ren->bill);

此外,与 malloc 不同,realloc 需要 2 个参数。第一个应该是指向您要重新分配的地址的指针,第二个应该是新的大小。所以:

ren = realloc(ren, 6 * sizeof(koly));



关于您的代码,我还有两件事要说。首先:没有必要在 C 中强制转换 malloc 的返回值(并且不受欢迎)。另外,切勿将 scanf"%s" 格式说明符一起使用。这是极其不安全的,很容易导致崩溃甚至更糟的情况。最好的方法是使用 fgets,因此 scanf("%s",ren->katana); 会变成这样:

fgets(ren->katana, sizeof(ren->katana), stdin);

编辑:以下是我对为什么应避免转换 malloc/realloc 返回值的解释:

这并不是真的因为错了;这是因为在 C 中这样做是不好的做法。由于 void* 类型会自动转换为任何指针类型,因此类型转换是多余的,代码可读性较差(IMO),并且它会进行更改更加困难。例如,以您的情况为例:

ren = (terma)malloc(sizeof(koly));

我个人会像这样重写这一行:

ren = malloc(sizeof(*ren));

这允许轻松更改ren的类型。如果将 ren 更改为其他数据类型(例如 int* 或 struct sockaddr_in* 或其他任何类型),它将自动工作。您不需要更改强制转换中的类型或 sizeof() 中的类型。两者都将自动适用于新类型。对于数组,它的工作原理是相同的:

int* myArr = malloc(42 * sizeof(*myArr));

如果我希望 myArr 保存 42 个 float 的数组,则更改很简单:

float* myArr = malloc(42 * sizeof(*myArr));

注意:在 C++ 中,类型转换是必需的,因为它不会自动将 void* 转换为其他指针类型,但您确实不应该使用 malloc 等al 在 C++ 中无论如何,当你有 new (加上这是一个 C 问题,而不是 C++)。

关于c - 在 C 中使用 malloc() 或 realloc() 存储并打印数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20965834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com