对于我的作业,我将不得不使用malloc动态创建一个字符串数组。
答:我真的无法理解已经可用的解决方案,因为它的使用方式与我想要的方式略有不同。

我的问题:
简而言之:我正在制作一个基于文本的冒险游戏。我的教授说,库存应该是“任何大小”。如果此人没有物品,那么库存的大小也应该为零,如果一件物品只有一个物品,等等,等等。

我试图使某些东西起作用,但是我并不能真正理解malloc的实际工作原理,所以这是我的代码(这显然是不正确的,但是做我想做的事情如何正确?):

char* inventory;
int amount=0;
inventory=(char*) malloc(sizeof(char)*amount);
//NOW THERE SHOULD BE AN INVENTORY WITH SIZE ZERO SINCE AMOUNT=0
//NOW I WANT TO GIVE THE PLAYER AN ITEM:
amount++;
inventory=(char*) malloc(sizeof(char)*(amount+1);
inventory[0]="sword";
//I WANT TO WRITE OUT INVENTORY TO TEST IF IT WORKS:
printf("%s", inventory[0]);
//FREE THE BITS LOCKED WITH MALLOC:
free(inventory);


教授告诉我们,由于字符串的最后一个字符必须为'\ 0'或类似的字符,因此我们必须写出amount + 1。

因此,这是我了解malloc的工作方式(但也许这不是它的工作方式,而且我理解不正确):
通常,这是您将如何创建字符串数组的示例,例如:

char strings[10][200];


这意味着您有10个字符串,每个字符串的长度可以为200个字符。
当我在代码中使用malloc时:
整数“ amount”与示例中的数字10基本上相同,sizeof(char)与示例中的数字200基本上相同,对吗?
如果没有,那么我完全迷路了。

尽管如此,我的代码显然仍无法正常工作,因此,如果您有时间的话,我将非常感谢您提供的有关使用malloc C代码的帮助以及一些说明。

最佳答案

我不清楚您要做什么,但让我们分析您的代码:

char* inventory;
int amount=0;
inventory=(char*) malloc(sizeof(char)*amount);


由于amount为零,您刚刚分配了零字节的内存。文档说:“如果size为0,则malloc在堆中分配零长度的项,并返回指向该项的有效指针”,因此您具有有效的指针,但没有存储空间。

amount++;
inventory=(char*) malloc(sizeof(char)*(amount+1);


现在,您已经分配了2个字节的存储空间。但是,您丢失了刚分配的存储,即使它是零字节,因为您将对malloc的第二次调用的结果分配给了保存对malloc的第一次调用的变量。您应该先free d它。

inventory[0]="sword";


这是无效的,因为inventorychar *,所以inventory[0]是单个char。您的编译器应该已经警告您,因此请打开警告。

printf("%s", inventory[0]);


此printf调用的结果是不确定的,因为您希望打印一个字符串,但只传递一个字符。

free(inventory);


很好,尽管您丢失了第一个分配(请参见上文)。

通过此分析,希望您可以修改代码以执行所需的操作。

10-07 12:05
查看更多