程序接收信号:“;EXC#u坏访问”;

程序接收信号:“;EXC#u坏访问”;,c,C,这fgets(myDiscPointer->songArray[0],21,stdin) 导致我的程序崩溃。我的结构中有以下内容 typedef struct { char Artist[21]; char Album[21]; int Year; char **songArray; }CD; 我宣布如下 CD myDisc; CD *myDiscPointer = &myDisc; 发生的另一件事是我的#define被Xcode抱怨了 #定义MaxCharacters 21 这在

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

typedef struct 
{
char Artist[21];
char Album[21];
int Year;
char **songArray;
}CD;
我宣布如下

CD myDisc;
CD *myDiscPointer = &myDisc;
发生的另一件事是我的#define被Xcode抱怨了

#定义MaxCharacters 21


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

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

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

之后是否使用了
MAXCHARACTERS
?可能是因为打字错误。

之后你没有使用
最大字符吗?可能是因为打字错误。

关于#定义,MaxCharacters似乎是一个打字错误 (最后的c和t是相反的)。这仅仅是一个输入错误,还是这个输入错误也导致了代码中的问题?

关于#define,maxcharatchers似乎是一个输入错误
(最后的c和t是相反的)。这仅仅是一个输入错误,还是该输入错误也会导致代码出现问题?

在哪里,您如何为
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);
}
#定义MAXARTIST 20
#定义MAXALBUM 20
类型定义结构
{
角色艺术家[MAXARTIST+1];
字符相册[MAXALBUM+1];
国际年;
情歌;
字符数组;
}CD;
CD*Allocd(字符常量*常量艺术家,字符常量*常量相册,整数年)
{
CD*CD=malloc(sizeof(*CD));
如果(!cd)
返回0;
strncpy(cd->艺术家,艺术家,最大艺术家);
strncpy(cd->Album,Album,MAXALBUM);
cd->Year=Year;
cd->歌曲=0;
cd->songArray=0;
返回光盘;
}
int addSongToCD(CD*const-CD,char-const*const-song)
{
字符**新数组;
夏新松;
纽松=马洛克(斯特伦(歌曲)+1);
如果(!新闻声)
返回0;
strdup(newSong,song);/*strdup使用strlen,因此malloc(strlen(…)+1)就足够了,不需要strndup最大长度的安全网*/
newArray=realloc(cd->songArray,sizeof(newArray*)*(cd->songs+1));
if(!newArray){
免费(新闻歌曲);/*不要泄漏内存*/
返回0;
}
cd->songArray=newArray;
cd->songArray[cd->songs++]=新闻歌曲;
返回cd->歌曲;
}
无效自由CD(CD*常数CD)
{
int i;
对于(i=0;isongs;++i){
免费(cd->songArray[i]);
}
免费(cd->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);
}
#定义MAXARTIST 20
#定义MAXALBUM 20
类型定义结构
{
角色艺术家[MAXARTIST+1];
字符相册[MAXALBUM+1];
国际年;
情歌;
字符数组;
}CD;
CD*Allocd(字符常量*常量艺术家,字符常量*常量相册,整数年)
{
CD*CD=malloc(sizeof(*CD));
如果(!cd)
返回0;
strncpy(cd->艺术家,艺术家,最大艺术家);
strncpy(cd->Album,Album,MAXALBUM);
cd->Year=Year;
cd->歌曲=0;
cd->songArray=0;
返回光盘;
}
int addSongToCD(CD*const-CD,char-const*const-song)
{
字符**新数组;
夏新松;
纽松=马洛克(斯特伦(歌曲)+1);
如果(!新闻声)
返回0;
strdup(newSong,song);/*strdup使用strlen,因此malloc(strlen(…)+1)就足够了,不需要strndup最大长度的安全网*/
newArray=realloc(cd->songArray,sizeof(newArray*)*(cd->songs+1));
if(!newArray){
免费(新闻歌曲);/*不要泄漏内存*/
返回0;
}
cd->songArray=newArray;
cd->songArray[cd->songs++]=新闻歌曲;
返回cd->歌曲;
}
无效自由CD(CD*常数CD)
{
int i;
对于(i=0;isongs;++i){
免费(cd->songArray[i]);
}
免费(cd->songArray);
}

Doesnt-CD*CD=malloc(sizeof(*CD));仅为指针分配足够大的内存?即“CD*CD”是指针,因此“sizeof(*CD)”是取消引用该指针时生成的类型的大小。所以:不,“CD*CD=malloc(sizeof(*CD));”精确地分配指针指向的类型所需的内存量。谢谢。为什么在所有函数声明中都使用“const”?因为它允许您使用字符串文字char*hello_there=“hello there”具有不同的含义,如“char mutable_string[]=“I'm mutable”前者将字符串“hello there”放入程序映像的只读部分,并向您提供一个类型为“char const*const”的指针,指向该部分-另一个在运行时保留一些内存,并用“I'm mutable”对其进行初始化,其内容也可写。为了能够传递这两个变量,类型必须是指向不可变值的指针,即“char-const”,指针本身被标记为const,这样就不会覆盖它们。哦,在你问之前,为什么是“char-const”而不是“const-char”,这是因为const存储分类器对它留下的令牌进行操作。例外情况是,如果const是语句中的第一个标记,那么它将向右操作。我喜欢事情保持一致,“char-const*const”比“const-char*const”更有意义,而且看起来比“const-char*const”更好;仅为指针分配足够大的内存?即“CD*CD”是指针,因此“sizeof(*CD)”是取消引用该指针时生成的类型的大小。所以:不,“CD*CD=malloc(sizeof(*CD));”精确地分配指针指向的类型所需的内存量。谢谢。为什么在所有函数声明中都使用“const”?因为它允许您使用字符串文字char*hello_there=“hello there”具有不同的含义,如“char mutable_string[]=“I'm mutable”前者将字符串“hello there”放入程序映像的只读部分,并向您提供一个类型为“char const*const”的指针,指向该部分-另一个在运行时保留一些内存,并用“I'm mutable”对其进行初始化,其内容也可写。能够