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

标签 c malloc scanf dynamic-memory-allocation realloc

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

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

#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/

相关文章:

c - 如何检查 C 中是否由完全相同的字符组成更多单词?

c - 使基于数组的程序在没有元素的情况下工作

c++ - 64位系统下程序崩溃

c++ - 为什么我们不能使用两个不同的可互换枚举?作为函数参数?

c - 使用 realloc 缩小内存分配

c 内存分配和数组的数组

c++ - 尝试输入十六进制值时,程序在 scanf ("%x",&foo) 上崩溃

c - 使用格式字符串扫描输入时出现段错误

input - 为什么scanf的输入总是0?

c - pthread : join a detached thread doesn't set errno correctly