有人可以告诉我代码有什么问题吗?抱歉,如果我是新手,但我长期以来一直在努力解决这个问题。我试图从用户那里获取输入,然后打印这些值。以下代码只是一个示例。
我尝试运行代码,但出现运行时错误。有人可以帮忙吗?
#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/