如何使用malloc.h头为结构指针分配内存?

如何使用malloc.h头为结构指针分配内存?,c,pointers,malloc,C,Pointers,Malloc,我正在使用mingw32 gcc编译器 这个代码有什么问题 答:首先,你把“是”改为“是”,至少有两个主要问题。让我详细说明一下 第1点。您将内存分配给指针,而不是指针的值。FWIW,使用*c(即在没有内存分配的情况下取消引用指针)无效,并将导致错误 第2点。请输入C中的malloc()和family的返回值。您使用的cast完全错误,证明了第一句话的真实性 要解决这些问题,需要改变 testp.c:15:43: error: conversion to non-scalar type re

我正在使用mingw32 gcc编译器

这个代码有什么问题

答:首先,你把“是”改为“是”,至少有两个主要问题。让我详细说明一下

  • 第1点。您将内存分配给指针,而不是指针的值。FWIW,使用
    *c
    (即在没有内存分配的情况下取消引用指针)无效,并将导致错误

  • 第2点。请输入C中的
    malloc()
    和family的返回值。您使用的cast完全错误,证明了第一句话的真实性

要解决这些问题,需要改变

testp.c:15:43: error: conversion to non-scalar type requested
  *c =(struct student)malloc(sizeof(struct student));
                                           ^
c = malloc(sizeof*c);   //yes, this is not a multiplication
                        //and sizeof is not a function, it's an operator

或者,为了更好

c = malloc(sizeof(struct student));
另外,请注意,要使用和族,您不需要
malloc.h
头文件。这些函数是在
stdlib.h
中原型化的


编辑:

建议:

  • 在使用返回的指针之前,请检查
    malloc()
    是否成功
  • 使用结束后,始终
    free()
    释放内存
  • main()
    的建议签名是
    intmain(void)
  • 这个代码有什么问题

    答:首先,你把“是”改为“是”,至少有两个主要问题。让我详细说明一下

    • 第1点。您将内存分配给指针,而不是指针的值。FWIW,使用
      *c
      (即在没有内存分配的情况下取消引用指针)无效,并将导致错误

    • 第2点。请输入C中的
      malloc()
      和family的返回值。您使用的cast完全错误,证明了第一句话的真实性

    要解决这些问题,需要改变

    testp.c:15:43: error: conversion to non-scalar type requested
      *c =(struct student)malloc(sizeof(struct student));
                                               ^
    
    c = malloc(sizeof*c);   //yes, this is not a multiplication
                            //and sizeof is not a function, it's an operator
    

    或者,为了更好

    c = malloc(sizeof(struct student));
    
    另外,请注意,要使用和族,您不需要
    malloc.h
    头文件。这些函数是在
    stdlib.h
    中原型化的


    编辑:

    建议:

  • 在使用返回的指针之前,请检查
    malloc()
    是否成功
  • 使用结束后,始终
    free()
    释放内存
  • main()
    的建议签名是
    intmain(void)
  • 这是有效的(在C和C++上)
    因为您最初包含了这两个标记

    改变

    这是有效的(在C和C++上)
    因为您最初包含了这两个标记

    改变


    malloc
    结果强制转换为
    (struct student*)
    ,而不是
    (struct student)
    。除非您使用了奇特的额外功能,否则不需要
    标题声明了基本内存分配函数:
    malloc()
    realloc()
    calloc()
    free()
    。正确标记问题。是C还是C++?在C语言中,不要强制转换malloc。在C++中,不要使用它,而是使用<代码>新的< /代码>。一旦你修复了其他问题,不要忘记添加<代码>免费(C)< /代码>。否则,就会泄漏内存。从职业生涯一开始就使用
    malloc()
    等工具,养成可靠跟踪内存的习惯也是很好的。要知道,如果内存在您使用的系统上运行,那么它就是您的朋友(如果它不在您的本机系统中运行,您可以始终托管一个VM,以便能够在VM中运行)。将
    malloc
    结果强制转换为
    (struct student*)
    ,而不是
    (struct student)
    。除非您使用了奇特的额外功能,否则不需要
    标题声明了基本的内存分配函数:
    malloc()
    realloc()
    calloc()
    free()<代码> >正确地标记你的问题。是C还是C++?C中不要投<代码> MalOC 。C++中完全不用它,而是使用<代码>新< /C>。不要忘记添加<代码> FAL(C)
    一旦你解决了其他问题。否则,你就会泄漏内存。最好从你的职业生涯开始就养成使用
    malloc()
    等可靠跟踪内存的习惯。要知道,如果它在你使用的系统上运行,那就是你的朋友(如果你的VM系统不能运行,你可以在VM中运行它)。所以,你建议一个演员阵容?这是因为@ Soaav回答了C,而不是C++。我删除了C++标签,因为OP的代码在C中兼容(一旦问题被解决)。还有一个
    .c
    扩展名。@CoolGuy是的,我现在很高兴。希望你不介意一点乐趣,对吧?:-)@SouravGhosh,是的。@UzumakiIchigo,C中的演员阵容是错误的。看,有一群人坚决反对演员阵容。我不是这个队伍的成员。但是,主要的反对意见是,如果你不声明内存分配函数,结果可能会被误解。因为C99和以后的版本需要声明所有有趣的内容如果编译时使用的选项强制您在使用前声明函数,并且您自己从未为内存分配函数编写声明(您始终使用标准或系统提供的头)所以,你建议的是一个演员角色。所以,你建议演员演员?因为@ SoAV回答了C,而不是C++。我删除了C++标签,因为OP的代码在C中是兼容的(一旦问题被修复了),而且还有<代码> C >代码>扩展。@酷乐,是的,我现在很高兴。希望你不介意一点乐趣,对吗?@苏拉沃什,是的。@然而,UzumakiIchigo的C语言演员阵容是错误的。看,有一群人坚决反对演员。我不是那个干部中的一员。然而,主要的反对意见是,如果不声明内存分配函数,结果可能会被误解。由于C99及更高版本要求声明所有函数,如果您使用强制您在使用前声明函数的选项进行编译,并且您从未为内存分配函数编写声明
    c =(struct student*) malloc(sizeof(struct student));