C Struct typdef malloc 赋值
Posted
技术标签:
【中文标题】C Struct typdef malloc 赋值【英文标题】:C Struct typdef malloc assignment 【发布时间】:2015-12-01 21:24:11 【问题描述】:我正在尝试使用名为 BankAccount
的结构,它需要名称为 50 个字母长的字符数组、int ID
和 double 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<BankAccount *>(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 赋值的主要内容,如果未能解决你的问题,请参考以下文章