gpt4 book ai didi

c - 字符串的正确内存分配

转载 作者:行者123 更新时间:2023-11-30 15:11:50 25 4
gpt4 key购买 nike

所以我已经遇到了这个问题,我已经尝试解决了大约 8 个小时...我已经放弃了在没有帮助的情况下寻找答案。我尝试分别使用 realloc()malloc(),因此任何输入都很棒!

在 C 中这样做的目的是允许创建“ map ”,稍后我将使用 ncurses 来创建 map 。

文件的输入如下

10X16 de4 dw9 ds8 g8,7 m3,4 h6,5 p2,2 
6X20 dn5 ds4 W4,3 e2,12 M1,1
10X13 ds3 dw9
10X12
5X4
6x12

这是代码:

char *importLevel()
{
FILE *fPointer;
fPointer = fopen("Level", "r"); //Opens text file to read
char* rooms[150];// set up for memory allocation
char commands[150];// set up for pulling data from read file

while (!feof(fPointer))
{
fgets(commands,150, fPointer); // this takes each line from the file
}

*rooms = (char *) malloc(150 * sizeof(char)); // memory allocation
for (int i = 0; i < 150; i++)
{
if (rooms[i] != NULL)
{
*rooms[i] = commands[i]; // supposed to give rooms the string
}
}

fclose(fPointer);// close file

return *rooms; // return pointer
}

我希望我没有像现在这样愚蠢!谢谢:)

编辑:我就像我当时感觉的那样愚蠢

最佳答案

这里有很多事情需要解决。

while (!feof(fPointer))
{
fgets(commands,150, fPointer); // this takes each line from the file
}

这将在每次循环时覆盖命令中的数据。当循环退出时,您将读取并丢弃除最后一行之外的所有数据。您可能需要使用二维数组,或者更有可能的是,在读取数据时将数据存储到 rooms 中。第二种方法更快并且使用更少的内存。

*rooms = (char *) malloc(150 * sizeof(char));

这看起来就像您正在尝试创建一个二维数组。相反,你会想做这样的事情:

for (int ii = 0; ii < 150; ++ii)
rooms[ii] = malloc(150 * sizeof(char));

请注意,此 malloc 不会初始化内存。所以你的支票

if (rooms[i] != NULL)

会给你不确定的结果。 rooms[i] 的内容未定义。如果您想将数组初始化为全零,请尝试使用 memset

然后:

*rooms[i] = commands[i];

不会复制命令中的数据,而只会复制命令中的第一个字符。要复制整个字符串,您需要使用 strcpystrncpy 以避免潜在的缓冲区溢出问题。 memcpy 也是复制一定数量字节而不是空终止 C 字符串的选项。

最后,返回*rooms 是一个等待发生的错误。您最好将 rooms 作为参数传递并分配给它。请参阅Allocate memory 2d array in function C了解如何做到这一点。

关于c - 字符串的正确内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35422929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com