对于我的作业,我将不得不使用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";
这是无效的,因为
inventory
是char *
,所以inventory[0]
是单个char
。您的编译器应该已经警告您,因此请打开警告。printf("%s", inventory[0]);
此printf调用的结果是不确定的,因为您希望打印一个字符串,但只传递一个字符。
free(inventory);
很好,尽管您丢失了第一个分配(请参见上文)。
通过此分析,希望您可以修改代码以执行所需的操作。