这里是指针如何用于存储和管理动态分配的内存块
的地址的示例#include <iostream>
#include <stdio.h>
using namespace std;
struct Item{
int id;
char* name;
float cost;
};
struct Item*make_item(const char *name){
struct Item *item;
item=malloc(sizeof(struct Item));
if (item==NULL)
return NULL;
memset(item,0,sizeof(struct Item));
item->id=-1;
item->name=NULL;
item->cost=0.0;
/* Save a copy of the name in the new Item */
item->name=malloc(strlen(name)+1);
if (item->name=NULL){
free(item);
return NULL;
}
strcpy(item->name,name);
return item;
}
int main(){
return 0;
}
但这是错误
1
>------ Build started: Project: dynamic_memory, Configuration: Debug Win32 ------
1> dynamic_memory.cpp
1>c:\users\david\documents\visual studio 2010\projects\dynamic_memory\dynamic_memory.cpp(11): error C2440: '=' : cannot convert from 'void *' to 'Item *'
1> Conversion from 'void*' to pointer to non-'void' requires an explicit cast
1>c:\users\david\documents\visual studio 2010\projects\dynamic_memory\dynamic_memory.cpp(20): error C2440: '=' : cannot convert from 'void *' to 'char *'
1> Conversion from 'void*' to pointer to non-'void' requires an explicit cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
出了什么问题?请帮忙
答案 0 :(得分:6)
由于这是C ++,您需要从malloc转换返回值,因为C ++不会自动将void *
转换为T *
:
item=static_cast<Item *>(malloc(sizeof(struct Item)));
或者甚至更好,停止使用malloc
并使用new
代替,您无需投射:
item = new Item;
item->name = new char[strlen(name + 1)];
也就是说,如果您使用new
,则需要使用delete
免费:
delete[] item->name;
delete item;
此外,如果您使用new
,默认情况下,运行时会通过抛出异常来通知您内存不足。虽然最好学习如何将异常作为临时停止间隙来处理,但您可以使用new
的nothrow版本,以便在内存不足时返回0:
item = new (std::nothrow) Item;
答案 1 :(得分:2)
我完全同意以前的答案 - 如果要在C ++程序中使用它,那么就用C ++方式做。
试试这个:
#include <iostream>
using namespace std;
struct Item{
int id;
string name;
float cost;
Item(char *pName) : id(-1), name(pName), cost(0) {}
};
// Look ma, no "make_item"!
然后,您将使用make_item:
...
pItem = make_item("hoozit");
...
用以下代码替换该代码:
...
pItem = new Item("hoozit");
...
答案 2 :(得分:0)
如果您只是想修复编译错误......
改变这个:
item=malloc(sizeof(struct Item));
要:
item=(item*)malloc(sizeof(struct Item));
和此:
item->name=malloc(strlen(name)+1);
要:
item->name=(char*)malloc(strlen(name)+1);
答案 3 :(得分:0)
第11行
item=malloc(sizeof(struct Item));
必须成为
item=(Item *)malloc(sizeof(struct Item));
第20行
item->name=malloc(strlen(name)+1);
必须成为
item->name=(char *)malloc(strlen(name)+1);
第21行
if (item->name=NULL){
必须成为
if (item->name==NULL){
。