分配存储以存储一个项目并将其值设置为某个项目

时间:2013-12-01 00:39:03

标签: c

所以我的任务是编写一个函数来分配存储来存储一个项目并将其值设置为输入。函数是initializeItem,结构是相关的,所以我把它包括在内。

typedef int Info;
typedef struct {
    Info info;
} Item;
typedef Item* ItemRef;

ItemRef initializeItem(Info g){
/* allocates storage to store one item and sets it to value g */
    Item item;
    item.info = g;
    printf("g = %d", g);
}

我相信我应该使用malloc,但我不清楚如何将它应用于这种情况。此外,这个功能应该有什么样的回报?

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

ItemRef initializeItem(Info g){
/* allocates storage to store one item and sets it to value g */
    ItemRef ptr = (ItemRef) malloc(sizeof(Item));
    if (!ptr) {
        std::cerr << "error. " << std::endl;
        return NULL;
    }
    ptr->info = g;
    return ptr;
}

int main() {
    ItemRef ptr = initializeItem(25);
    if (!ptr) {
        std::cerr << "error. " << std::endl;
    } else {
        std::cout << ptr->info << std::endl; // 25
        free(ptr);
    }
    return 0;
}

作为一个完整性检查,我在valgrind上运行了这个。

==21934== HEAP SUMMARY:
==21934==     in use at exit: 0 bytes in 0 blocks
==21934==   total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==21934==
==21934== All heap blocks were freed -- no leaks are possible

答案 1 :(得分:0)

您的代码不起作用的原因是,在函数initializeItem中,名为item的变量是函数的本地变量,因此当函数返回时,该变量将超出范围并且它所居住的记忆以后可以被覆盖等等。

从您的代码中看起来您希望initializeItem的返回类型为ItemRef,这是指向Item的指针。请注意,在您的代码中,initializeItem实际上并未返回任何内容。

您应该使用malloc的原因是,当您离开调用malloc的函数范围时,malloc不会失去对您提供的内存的所有权。看起来malloc教程可能对您有所帮助。

无论如何,你可能想要这样的东西:

ItemRef initializeItem(Info g) {
    ItemRef item_ref = (ItemRef)malloc(sizeof(Item));
    item_ref->info = g;
    return item_ref;
}