c - 将数据动态添加到指向函数内结构的指针数组

标签 c function pointers struct pointer-to-pointer

我尝试了很多组合,但实际上没有任何效果。已经够久了,所以我决定写这个问题。

我只想要一个指向结构的指针数组,这样我以后可以通过交换地址轻松地对它进行排序。我有一个函数可以从文件中获取数据并写入数组。不幸的是,我不可能在函数外读取这些数据。

我最后一次尝试(我删除了文件操作,因为这些不是问题所在):

Header.h:

#pragma once

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

typedef struct {
    int32_t year;
    uint16_t month;
    uint16_t day;
} Date;

typedef struct {
    char name[16];
    Date date;
    uint32_t number;
} Player;

size_t readData(Player** players);

来源.c:

#include "Header.h"

size_t readData(Player** players) {
    players = NULL;

    players = realloc(players, sizeof(Player*) * 1);
    players[0] = malloc(sizeof(Player));
    strcpy(players[0]->name, "asd");
    printf("$ %s\n", players[0]->name);//OK

    return 1;
}

int main() {
    Player **players = NULL;
    uint32_t elemCount, i;

    elemCount = readData(players);

    printf("> %s", players[0]->name);//BUM - ERROR!

    return 0;
}

我正在使用 Visual Studio Community 2015。我知道用 C 编写代码并不是那么重要,但我设法配置了解决方案,我觉得这似乎不是问题。

我将非常感谢您的帮助。然而,我希望将其视为对我的代码的重制。我像这样尝试了对 StackOverFlow 上问题的一些其他答案,但它们没有帮助。

最佳答案

如果函数的参数不仅被读取而且还应该作为输出,则必须将指向数据的指针传递给函数。如果你的数据类型是Player**,你的参数类型必须是Player ***,所以玩家列表本身可以在函数内部改变。

size_t readData(char* fname, Player*** players) {
                                // ^ players is a input and output parameter
    Player **tempPlayers = *players; // local list of players
    tempPlayers = realloc(tempPlayers, sizeof(Player*) * 1);
    tempPlayers[0] = malloc(sizeof(Player));
    strcpy(tempPlayers[0]->name, "asd");
    printf("$ %s\n", tempPlayers[0]->name);//OK

    *players = tempPlayers; // write back list of players to paramter
    return 1;
}

int main() {
    Player **players = NULL;
    uint32_t elemCount, i;

    char *fileName = NULL; 
    elemCount = readData(&players);
                      // ^

    printf("> %s", players[0]->name);//BUM - ERROR!

    return 0;
}

如果你不想使用***,你可以这样做:

Player* *readData(char* fname, Player** players, size_t *size) {
    players = realloc(players, sizeof(Player*) * 1);
    players[0] = malloc(sizeof(Player));
    strcpy(players[0]->name, "asd");
    printf("$ %s\n", players[0]->name);//OK

    *size = 1;
    return players;
}

players = readData( fileName,  players, &elemCount );

关于c - 将数据动态添加到指向函数内结构的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816855/

相关文章:

为 ANSI-C 创建编译时查找数组?

function - std::function 可以接受仿函数吗?

c++ - 成员初始化列表,无参数指针初始化

c++ - 将常量传播到成员变量指向的数据

c++ - C++ 中 <type*[n]> 和 <type(*)[n]> 的区别

c - 我得到了 3 个结构,我必须使用堆并将一些数据输入到结构的成员中

c - c中函数的声明和使用

c++ - C/C++ 中的递归函数

javascript - 在 Javascript 中努力创建星号

javascript - 混淆的加法运算符逻辑