gpt4 book ai didi

C - 动态分配覆盖现有数据?

转载 作者:行者123 更新时间:2023-11-30 19:10:04 24 4
gpt4 key购买 nike

所以我有一个作业,其中有一个名为 Song 的结构。通过这个结构,我使用 Song 结构对数组进行动态分配。

所以当我尝试将另一首歌曲添加到我的结构中的数组时,我遇到了这个问题。当使用情况 4 向数组添加另一首歌曲时,它将 struct Song 中的变量值更改为垃圾值。我不知道为什么它会这样做。预期结果应该是数组扩展并将歌曲添加到 aSong 中。使用情况 4 后打印 aSong 数组就是问题开始的地方。

我没有收到编译器错误。该程序只是打印出垃圾值。

这是代码(我知道我可以通过将代码放在函数中使其看起来更好):

#pragma warning(disable : 4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "lab3.h"

//Global variables
struct Song *aSong;
int howMany = 0;

int menu(struct Song *songs) {

int answer = 0;

printf("Choose from the menu: \n");
printf("1. Song menu.\n");
printf("2. Exit\n");
scanf("%d", &answer);

switch (answer)
{
case 1:

printf("Choose from the menu: \n");
printf("1. Add song. \n");
printf("2. Randomize list.\n");
printf("3. Print list.\n");
printf("4. Add another song.\n");
printf("5. Go back\n");
scanf("%d", &answer);

switch (answer)
{

case 1:
printf("How many songs would you like to add right now?: \n");
scanf("%d", &howMany);
getchar();

aSong = (struct Song *) malloc((sizeof(struct Song) * howMany));

for (int i = 0; i < howMany; i++) {
//Adds songs to the array. Depends on how many the user wants to add
printf("Enter a songname: \n");
fgets(aSong[i].titel, SIZE, stdin);
fflush(stdin);
getchar();
printf("Enter the artist/band: \n");
fgets(aSong[i].artist, SIZE, stdin);
fflush(stdin);
getchar();
printf("Enter which year the song was released: \n");
scanf("%d", &aSong[i].releaseD);
fflush(stdin);
getchar();
}
printf("Music added!\n");
getchar();
menu(&songs);
break;

case 3:
printf("-------------------------------\n");
printf("Songs stored: \n");
//Prints the songs
for (int i = 0; i < howMany; i++) {
printf("\nSong titel: %s Band/Artist: %s Release year: %d\n", aSong[i].titel, aSong[i].artist, aSong[i].releaseD);
}
printf("-------------------------------\n");
menu(&songs);
getchar();
break;

case 4:
//Add another song to the array
printf("Add another song: \n");
struct Song* tmp = (struct Song*)malloc((howMany + 1) * sizeof(struct Song));

//Change the array by increasing the nr of slots
for (int i = 0; i < howMany; i++) {
tmp[i] = aSong[i];
}

//Redirect the pointers so it points to the correct array
free(aSong);
aSong = tmp;
tmp = NULL;

printf("Enter song name: \n");
fgets(aSong[howMany].titel, SIZE, stdin);
getchar();
printf("Enter band/artist name: \n");
fgets(aSong[howMany].artist, SIZE, stdin);
getchar();
printf("Enter the year when the song was released:\n");
//scanf(" %d", &aSong[howMany].releaseD);
fgets(aSong[howMany].artist, SIZE, stdin);
getchar();
printf("Song added!");
printf("-------------------");

howMany++;
free(aSong);
menu(&songs);
break;

case 5:
printf("Exit.");
menu(&songs);
break;
}
case 2:
return 0;
break;
}
}

我的main.c文件只调用menu(&songs)函数。

我正在使用一个菜单系统,允许用户选择他们想要执行的操作。 该系统的基本使用如下:

 * You enter the "Add song" menu. 
* You choose how many songs you would like to enter
* The user adds the info of the song
* User prints the stored songs with case 3
* User wants to add another song to the array with case 4
* User enters data again to add another song (YOU CAN'T ADD SONGS AGAIN WITH CASE 1, YOU HAVE TO USE CASE 4)
* User wants to print the songs again with the print case 3
* Program prints out trash values and the old songs that printed out nicely before are now trash also.

我似乎无法理解我做错了什么。请有人赐教。

lab3.h 文件的结构:

#ifndef LAB3_H
#define LAB3_H
#define SIZE 80

struct Song
{
char titel[SIZE];
char artist[SIZE];
int releaseD;
};
int menu(struct Song *songs);

#endif // !LAB3_H

编辑

(在 main.c 中,我确实有 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 来查找内存泄漏。)

最佳答案

在情况4的最后有一个调用free(aSong),因此在menu的递归调用中数组的内容丢失了。希望这会有所帮助。

关于C - 动态分配覆盖现有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921053/

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