【发布时间】:2016-01-15 17:46:20
【问题描述】:
我尝试了很多组合,但实际上没有任何效果。时间已经够长了,所以我决定写这个问题。
我只想要一个指向结构的指针数组,以便以后可以通过交换地址轻松对其进行排序。我有一个从文件中获取数据并写入数组的函数。不幸的是,我无法在函数之外读取这些数据。
我最后一次尝试(我删除了文件操作,因为这些不是问题):
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 编码并没有那么多,但我设法配置了解决方案,而且它似乎不是 imo。
我将非常感谢您的帮助。然而,我想把它看作是我的代码的翻版。我尝试了一些其他类似 StackOverFlow 问题的答案,但没有帮助。
【问题讨论】:
-
在调用
realloc()时,始终将返回值保存到临时变量中,然后在分配给目标变量之前检查(!=NULL)该变量。这样当realloc()失败时,原来分配的内存指针不会丢失然后如果== NULL,则处理错误 -
这一行:
players = NULL;是一个非常糟糕的主意,因为传递的指针正在被破坏 -
函数:
readData()返回一个size_t,但size_t被分配给uint32_t。这会导致隐式转换。这可能导致值被破坏。建议:更改readData()函数的签名以返回uint32_t -
这一行:
int32_t year;应该是uint32_t year;,因为没有负数 -
编译时,始终启用所有警告,然后修复这些警告。 (对于 gcc,至少使用:
-Wall -Wextra -pedantic(我也推荐:-Wconversion -std=c99))。除此之外,这将表明变量i未被使用。
标签: c function pointers struct pointer-to-pointer