指向C中第一个动态分配内存块的Point结构指针

指向C中第一个动态分配内存块的Point结构指针,c,pointers,memory,struct,dynamic-memory-allocation,C,Pointers,Memory,Struct,Dynamic Memory Allocation,在我的代码中,我用名为ptr的struct Song指针分配了一些内存 . 我现在要做的是创建第二个指针,它总是指向分配内存中的第一个结构,并在我想要打印信息时使用它来循环所有结构 大体上看起来是这样的: #include "FuncDek.h" #include <locale.h> #include <crtdbg.h> int main() { //For swedish and check memory leak _CrtSetDbgFlag

在我的代码中,我用名为ptr的struct Song指针分配了一些内存 . 我现在要做的是创建第二个指针,它总是指向分配内存中的第一个结构,并在我想要打印信息时使用它来循环所有结构

大体上看起来是这样的:

#include "FuncDek.h"
#include <locale.h>
#include <crtdbg.h>


int main() 
{
    //For swedish and check memory leak
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    setlocale(LC_ALL, "swedish");

    //Create with starting size of 5
    Song *ptr = (Song *)malloc(sizeof(Song) * 5);
    Song *start = &(ptr[0]);

    int menuChoice = 0;
    int nrOfSongs = 0;
do
{
    system("cls");
    menuChoice = menu();

    switch (menuChoice)
    {
    case 1: 
        addSong(&ptr, &nrOfSongs);
        break;
    case 2:
        showList(&start, nrOfSongs, &ptr);
        break;
    default:
        printf("\nFelaktigt val, försök igen\n");
        system("pause");
        break;
    }

} while (menuChoice != 0);

//TODO Free memory
//free(ptr);

system("pause");
return 0;
#包括“fundek.h”
#包括
#包括
int main()
{
//用于检查和检查内存泄漏
_CRTSETDBG标志(_CRTDBG_ALLOC_MEM_DF|u CRTDBG_LEAK_CHECK_DF);
setlocale(LC_ALL,“瑞典语”);
//创建的起始大小为5
Song*ptr=(Song*)malloc(sizeof(Song)*5);
歌曲*开始=&(ptr[0]);
int menuChoice=0;
int nrOfSongs=0;
做
{
系统(“cls”);
menuChoice=菜单();
开关(menuChoice)
{
案例1:
addSong(&ptr,&nrOfSongs);
打破
案例2:
展示列表(和开始、nrOfSongs和ptr);
打破
违约:
printf(“\nFelaktigt val,försök igen\n”);
系统(“暂停”);
打破
}
}while(menuChoice!=0);
//TODO空闲内存
//免费(ptr);
系统(“暂停”);
返回0;
}

我必须创建包含函数声明/定义的文件,这些声明/定义如下所示:

#ifndef FUNCDEK
#define FUNCDEK

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char title[30];
    char artist[30];
    unsigned int year;

} Song;

int menu();
void addSong(Song *ptr, int *nrOfSongs);
void showList(Song *start, int nrOfSongs, Song *ptr);

#endif
#ifndef functdek
#定义FUNCDEK
#包括
#包括
类型定义结构{
字符标题[30];
炭艺术家[30];
未签名整数年;
}歌曲;
int菜单();
void addSong(歌曲*ptr,int*nrOfSongs);
无效显示列表(歌曲*开始,歌曲*ptr);
#恩迪夫
以及:

#包括“fundek.h”
#杂注警告(禁用:4996)
//显示菜单并保存用户选择
int菜单()
{
fflush(stdin);
int-choice=0;
printf(“Menyval pålåtlista\n”);
printf(“---------------------------\n”);
printf(“1.Lägg至Låt\n”);
printf(“2.Visa låtlista”);
printf(“3.Blanda låtlistan”);
printf(“4.Spara-till-fil”);
printf(“0.Avsluta程序\n”);
scanf(“%d”,选择(&C);
getchar();
/*托多费汉廷酒店*/
回报选择;
}
//将歌曲添加到列表中
void addSong(歌曲*ptr,int*nrOfSongs)
{
系统(“cls”);
歌温;
printf(“Ange låtens namn:\n”);
int sizeOfTitle=sizeof(临时标题)/sizeof(临时标题[0]);
fgets(临时标题、尺寸、标准);
printf(“Ange artistens namn:\n”);
int sizeOfArt=sizeof(临时艺术家)/sizeof(临时艺术家[0]);
fgets(临时艺术家、sizeOfArt、stdin);
printf(“Angeåret låtens släpptes:\n”);
scanf(“%d”、&temp.year);
对于(int i=0;i艺人[i]=临时艺人[i];
ptr->title[i]=临时标题[i];
}
ptr->年份=临时年份;
*ptr++;
*nrOfSongs=*nrOfSongs+1;
}
//打印列表中的所有内容
无效显示列表(歌曲*开始,歌曲的内部nrOfSongs,歌曲*ptr)
{
系统(“cls”);
printf(“歌曲列表”);
printf(“-------------------------------------\n”);
对于(int i=0;i<1;i++)
{
printf(“Låt:%s\n”,开始->标题);
printf(“艺术家:%s\n”,开始->艺术家);
printf(“År:%d\n”,开始->年份);
启动++;
}
系统(“暂停”);
}
但是当我运行showList函数时,我会得到垃圾值,并且我还可以看到我没有读取正确的内存位置。
所以我的问题是如何让我的指针称为开始指向PTR中的第一个内存块?

你可以考虑使用C链接列表。
这是一个很好的例子。

问题不在发布的代码中。如果第一个参数的值错误,那么在调用函数时,您需要修复它以获得正确的值。。。但是你没有显示代码,所以我们没办法。。。请提供一份报告。@hyde忘了那个。只是用它来看看ptr实际上包含了一些它确实包含的东西。但我的开始指针似乎没有指向我that@anderssinho不要发布所有的代码,但是a(是的,这意味着你有一些工作)
addSong(&ptr,&nrOfSongs)
您正在为第一个参数传递
Song**
,但函数需要
Song*
。编译器应该警告您这一点。
#include "FuncDek.h"
#pragma warning(disable: 4996)

//Show menu and save the users choice
int menu()
{
    fflush(stdin);

    int choice = 0;

    printf("Menyval på låtlista\n");
    printf("-------------------------\n");
    printf("1. Lägg till låt \n");
    printf("2. Visa låtlista \n");
    printf("3. Blanda låtlistan \n");
    printf("4. Spara till fil \n");
    printf("0. Avsluta program \n");
    scanf("%d", &choice);
    getchar();

    /*TODO FELHANTERING*/

    return choice;
}

//Add song to list
void addSong(Song *ptr, int *nrOfSongs)
{
    system("cls");
    Song temp;
    printf("Ange låtens namn:\n");
    int sizeOfTitle = sizeof(temp.title) / sizeof(temp.title[0]);
    fgets(temp.title, sizeOfTitle, stdin);
    printf("Ange artistens namn:\n");
    int sizeOfArt = sizeof(temp.artist) / sizeof(temp.artist[0]);
    fgets(temp.artist, sizeOfArt, stdin);
    printf("Ange året låtens släpptes: \n");
    scanf("%d", &temp.year);

    for (int i = 0; i < sizeOfTitle; i++)
    {
        ptr->artist[i] = temp.artist[i];
        ptr->title[i] = temp.title[i];
    }

    ptr->year = temp.year;
    *ptr++;
    *nrOfSongs = *nrOfSongs + 1;

}

//Print all from list
void showList(Song *start, int nrOfSongs, Song *ptr)
{

    system("cls");
    printf("Song list\n");
    printf("-----------------------------\n");
    for (int i = 0; i < 1; i++)
    {
        printf("Låt: %s \n", start->title);
        printf("Artist: %s \n", start->artist);
        printf("År: %d \n", start->year);
        start++;
    }
    system("pause");
}