gpt4 book ai didi

c - 动态内存分配结构

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:29 25 4
gpt4 key购买 nike

下面的代码假设读取和存储一个输入文本文件,并将其内容存储在适当的结构中,动态地。第一个数字是专辑数量,第二个数字是这张专辑中的轨道数量,每个标题前面的数字是该标题中的字符数。

对于我到目前为止编写的代码,我试图使每个专辑都与 1 个独立的结构相关联,因此我创建了一个 Struct 数组。所以目前我能够正确读取专辑数量和轨道数量。但是,我在处理 struct album 中的指针数组时遇到了问题。我在为它动态分配正确的内存以及将所有(在本例中为 17 个)轨道名称存储到整个指针数组中时遇到了麻烦,轨道标题前面没有数字。

示例文本文件:

1
17
16 Like an umbrella
...
15 Dynasty Warrior

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct album
{
int num_tracks;
char *tracks[];

};

int main(int argc, char *argv[]){

int numbALBUMS=0, numbCharInTrack=0;
int i=0,j=0;

FILE *albums;
albums = fopen (argv[1], "r");

fscanf(albums, "%d", &numbALBUMS);
struct album info[numbALBUMS];

for(i=0;i<numbALBUMS;i++){
fscanf(albums, "%d", &info[i].num_tracks);
for(j=0;j<info[i].num_tracks;j++){
fscanf(albums, "%d" , &numbCharInTrack);

//NEED HELP HERE
//fscanf(albums,"s",info[i].tracks[j]);
}

}

fclose(albums);
return 0;

}

最佳答案

struct Album info[numAlbums]

不正确,你必须这样做:

struct Album *info = (struct album*)malloc(numAlbums * sizeof(struct Album));

type name[numOfElements]; 形式的语句只能用于静态分配。

您应该将 char *tracks[] 替换为 char **tracks。您可以使用 char *tracks[],但这更困难。(如果您想看一看:What's the need of array with zero elements?)

然后你必须添加

info[i].tracks = malloc(sizeof(char*) * info[i].num_tracks);

fscanf 语句之后的第一个 for 循环中。

最后,您必须在最内层的 for 循环中,在第一个 fscanf 语句之后,为包含 trak 名称的字符串分配内存。你可以这样做:

info[i].tracks[j] = malloc(sizeof(char) * (numbCharInTrack + 1));  //number of characters + '\0'

然后您可以从文件中读取轨道名称。

fgetc(album); //Read past the leading space
fgets(info[i].tracks[j], numbCharInTrack + 1, album);

编辑

添加了从文件代码读取名称。

malloc(sizeof(char) * numbCharInTrack) 替换为 malloc(sizeof(char) * (numbCharInTrack + 1)),忘记终止空字符。

关于c - 动态内存分配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697755/

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