Storing using malloc() or realloc() and printing data in C



有人能告诉我代码出了什么问题吗?对不起,如果我是新手,但我很长一段时间都在努力做好这件事。我正在尝试从用户那里获得输入,然后打印值。以下代码只是一个示例。

我尝试运行代码,但遇到运行时错误。有人能帮忙吗?

#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);

但请注意:你只写了一个对象。

相关内容

  • 没有找到相关文章

最新更新