有人能告诉我代码出了什么问题吗?对不起,如果我是新手,但我很长一段时间都在努力做好这件事。我正在尝试从用户那里获得输入,然后打印值。以下代码只是一个示例。
我尝试运行代码,但遇到运行时错误。有人能帮忙吗?
#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:nn");
while(++count<= 2)
{
scanf("%d",ren->kill);
scanf("%f",ren->bill);
scanf("%s",ren->katana);
}
while(++count<= 2)
{
printf("n%dn",ren->kill);
printf("n%fn",ren->bill);
printf("n%sn",ren->katana);
}
}
关于您的错误:
scanf("%d",ren->kill);
scanf("%f",ren->bill);
这些应该是指针,所以更正后的版本是:
scanf("%d",&ren->kill);
scanf("%f",&ren->bill);
此外,realloc
需要2个不同于malloc
的参数。第一个应该是指向正在重新定位的地址的指针,第二个应该是新的大小。因此:
ren = realloc(ren, 6 * sizeof(koly));
关于您的代码,我还有两件事要说。第一:不需要将malloc
的返回值强制转换为C(这是不可取的)。此外,千万不要将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));
这允许容易地改变CCD_ 11的类型。如果ren
被更改为另一种数据类型(如int*
或struct sockaddr_in*
或其他任何类型),它将自动工作。您不需要更改强制转换中的类型或sizeof()
中的类型。两者都将自动适用于新类型。对于阵列,它的工作原理是一样的:
int* myArr = malloc(42 * sizeof(*myArr));
如果我想让myArr
保持一个42个float
的数组,那么改变很简单:
float* myArr = malloc(42 * sizeof(*myArr));
注意:在C++中,typecast是必需的,因为它不会自动将void*
转换为其他指针类型,但当您有new
时,无论如何都不应该在C++中使用malloc
等(另外,这是一个C问题,而不是C++)。
void*realloc(void*ptr,size_t size);
realloc有两个参数,原型如上所述,您在代码中错过的是提供要重新分配内存的指针。
你必须使用,ren=(terma)realloc(rem,6*sizeof(koly));
另一个错误是你错过了&scanf函数中的运算符,应该是scanf("%d",&ren->kill);
这不是运行时错误,你是否正确编译了代码。。。?
Realloc()接受两个参数。它是如何编译的?
ren = (terma)realloc(ren,6*sizeof(koly));
您还需要校正扫描:
scanf("%d",&ren->kill);
scanf("%f",&ren->bill);
但请注意:你只写了一个对象。