繁体   English   中英

程序接收信号:“ EXC_BAD_ACCESS”

[英]Program received signal: “EXC_BAD_ACCESS”

这个fgets(myDiscPointer->songArray[0], 21, stdin); 导致我的程序崩溃。 我的结构中包含以下内容。

typedef struct 
{
char Artist[21];
char Album[21];
int Year;
char **songArray;
}CD;

我声明以下内容

CD myDisc;
CD *myDiscPointer = &myDisc;

发生的另一件事是Xcode抱怨了我的#define。

#define MAXCHARATCERS 21

当我使用它时,这被视为未声明。

您没有为songArray分配内存,这会导致在您写入随机位置时程序崩溃。

您在哪里为songArray分配内存? 您需要这样的东西:

#define MAXARTIST 20
#define MAXALBUM 20

typedef struct 
{
    char Artist[MAXARTIST+1];
    char Album[MAXALBUM+1];
    int Year;
    int songs;
    char **songArray;
} CD;

CD *allocCD(char const * const artist, char const * const album, int year)
{
    CD *cd = malloc(sizeof(*cd));
    if(!cd)
        return 0;

    strncpy(cd->Artist, artist, MAXARTIST);
    strncpy(cd->Album, album, MAXALBUM);
    cd->Year = year;
    cd->songs = 0;
    cd->songArray = 0;

    return cd;
}

int addSongToCD(CD * const cd, char const * const song)
{
    char **newArray;
    char *newSong;

    newSong = malloc(strlen(song)+1);
    if(!newSong)
         return 0;

    strdup(newSong, song); /* strdup uses strlen so malloc(strlen(...)+1) is sufficient, no need for the strndup max length safety net */

    newArray = realloc(cd->songArray, sizeof(newArray*) * (cd->songs + 1));

    if(!newArray) {
        free(newSong); /* don't leak memory */
        return 0;
    }

    cd->songArray = newArray;
    cd->songArray[cd->songs++] = newSong;

    return cd->songs;
}

void freeCD(CD * const cd)
{
    int i;
    for(i=0; i < cd->songs; ++i) {
        free(cd->songArray[i]);
    }
    free(cd->songArray);
}

之后您没有使用MAXCHARACTERS吗? 可能是因为错字。

关于#define,MAXCHARATCERS似乎是一个错字(最后一个c和t颠倒了)。 这只是这里的错字,还是错字也会在您的代码中引起问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM