c - 将结构指针指向 C 中动态分配内存的第一个 block

标签 c pointers memory struct dynamic-memory-allocation

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

它在 main 中看起来像这样:

#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;

}

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

#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

还有:

#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");
}

但是当我运行 showList 函数时,我得到了垃圾值,而且我还可以看到我没有读取正确的内存位置。 所以我的问题是如何使名为 start 的指针指向 ptr 中的第一个内存块?

最佳答案

可以考虑使用C链表。

Here就是一个很好的例子。

关于c - 将结构指针指向 C 中动态分配内存的第一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426549/

相关文章:

c - 内存只读的机制是什么?

c - 更新了 Leetcode 上的合并间隔问题 #56(特别是 C 语言)

c++ - C++ 中 typedef 和指针的规则是什么?

c - 从文件 (.txt) 中读取并保存到 char* C

c++ - Eigen 与 -O3 警告 : argument 1 value ‘X’ exceeds maximum object size Y

c - 效率核心是否支持与性能核心相同的指令?

c - 数组的地址和它的第一个元素的地址是一个回填问题

c - C中输入循环的范围

c# - 无法获取托管类型的地址、获取其大小或声明指向托管类型的指针

c - 如何确保二维数组在内存中连续分配