簡體   English   中英

動態內存分配

[英]dynamic memory allocation

這是如何使用指針存儲和管理動態分配的內存塊地址的示例

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

怎么了?請幫忙

由於這是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;

我完全同意以前的答案-如果要在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");
    ...

如果您只想修復編譯錯誤...

更改此:

item=malloc(sizeof(struct Item));

至:

item=(item*)malloc(sizeof(struct Item));

和這個:

item->name=malloc(strlen(name)+1);

至:

item->name=(char*)malloc(strlen(name)+1);

在第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);

if (item->name=NULL){
必須成為if (item->name==NULL){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM