带结构的动态内存分配

时间:2014-11-02 09:12:29

标签: c memory memory-management dynamic

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

对于我到目前为止编写的代码,我试图使每个相册与每个相关的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;

}

1 个答案:

答案 0 :(得分:2)

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)),忘记终止空字符。