我尝试了很多组合,但实际上没有任何效果。已经够久了,所以我决定写这个问题。
我只想要一个指向结构的指针数组,这样我以后可以通过交换地址轻松地对它进行排序。我有一个函数可以从文件中获取数据并写入数组。不幸的是,我不可能在函数外读取这些数据。
我最后一次尝试(我删除了文件操作,因为这些不是问题所在):
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/