【问题标题】:Dynamic memory allocation with structures带结构的动态内存分配
【发布时间】:2014-11-02 09:12:28
【问题描述】:

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

对于我到目前为止编写的代码,我试图让每个专辑都与 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) char *tracks[num_tracks]; --> char **tracks;char *tracks[];
  • 2)struct album info[numbALBUMS-1]; --> struct album info[numbALBUMS];
  • Ty,我用过 *tracks[];出于某种原因**曲目;没用,我可能没有正确使用它。
  • 您必须由 malloc 保护。即char **tracks;tracks = malloc(17*sizeof(char *));..tracks[i] = malloc(len+1);..strcpy(tracks[i], buff);的 17 条轨道
  • strcpy(tracks[i],buff);最后?

标签: c memory memory-management dynamic


【解决方案1】:
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 循环中,在第一个 fscanfstatement 之后,为包含 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)),忘记终止空字符。

【讨论】:

  • 我已经对我的代码进行了更改,但是我应该如何逐行扫描我的曲目名称?
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2015-05-17
  • 2020-04-18
  • 1970-01-01
相关资源
最近更新 更多