C Struct typdef malloc 赋值

Posted

技术标签:

【中文标题】C Struct typdef malloc 赋值【英文标题】:C Struct typdef malloc assignment 【发布时间】:2015-12-01 21:24:11 【问题描述】:

我正在尝试使用名为 BankAccount 的结构,它需要名称为 50 个字母长的字符数组、int IDdouble balance。我正在尝试使用malloc() 将其指向指针,但我明白了

error : void can not be assigned to an entity of type BankAccount.
typedef struct

    char name[50];
    int ID;
    double balance;
 BankAccount;

FILE *fp;
BankAccount *accounts = 0;
int accountSize = 0;
// I init like this in main function

accounts = malloc(accountSize * sizeof(*accounts));



void ReadAccountData(BankAccount *accounts, FILE *fp, int arraySize)

int i = 0;
while (!feof && i < arraySize) 
    fread(&accounts, sizeof(accounts), i, fp);
    i++;
 

  

【问题讨论】:

使用 C 编译器,而不是 C++ 编译器! 那么,accountSize = 0? @iharob:是的,这是另一个问题。但不是错误消息的原因。 @Olaf 唯一可能的原因在您的第一条评论中很清楚。 @iharob: 每只狗都有它的一天;-) 【参考方案1】:

如果您使用 C 语言,则需要为您的代码使用 C 编译器。您现在使用的编译器看起来像 C++ 编译器,需要将 void * 转换为指定类型。正如@Olaf (Why you can't cast void * in C) 指出的那样,在 C 中你不应该这样做。

如何更改编译器?这取决于您使用的 IDE 和操作系统,这需要在我提供更多详细信息之前指定。

如果你想使用 C++,你有几个选择:

    使用malloc,但转换返回值:

    accounts = static_cast<BankAccount *>(
                   malloc(accountSize * sizeof(BankAccount)));
    

    使用C++专用的动态分配,并将BankAccount视为C++结构(可以添加构造函数、析构函数、方法等):

    accounts = new BankAccount[accountSize];
    

【讨论】:

我正在使用 Visual Studio,我将如何使用 C 编译器? 你可以试试这个答案:C on Visual Studio【参考方案2】:

应该是这样的:

accounts = (BankAccount *)malloc(accountSize * sizeof(BankAccount));

【讨论】:

不要在 C 中转换 void * 如果 OP 打算使用 c++,它应该是 static_cast&lt;BankAccount *&gt;(malloc(...)) 并且更有可能的是,BankAccount 可能有一个构造函数,所以 new BankAccount[accountSize] 在 C 中我们没有构造函数。但我仍然不明白@Olaf 说我的答案不正确。 You don't cast void * in c, that's it. @iharob:没有说要在 C 中使用构造函数,但以防他将 C 与 C++ 混淆,以便在类中使用构造函数。但这似乎是 C 代码:malloc 和朋友返回void *。并且您不应该将它转换为/从另一个指针类型在 C 中。在 C++ 中你必须(但根本不应该使用这些函数)。

以上是关于C Struct typdef malloc 赋值的主要内容,如果未能解决你的问题,请参考以下文章

TYPDEF使用注意部分

小鹿老师之如何在用类模板的同时用typdef

C程序定义一指针变量,直接令它赋值为NULL,不对它用malloc申请内存可以么?赋值和申请内存到底有啥区别

struct 内部的 malloc 结构数组

Struct中的C语言指针数组

如何为C中的字符串数组赋值?