gpt4 book ai didi

c - 如何分配指向结构体的二维指针数组

转载 作者:行者123 更新时间:2023-11-30 16:57:29 25 4
gpt4 key购买 nike

这是我到目前为止所得到的,但我不知道它是否正确。该函数接收二维数组 (nxn) 的维度,并对其进行分配。FlightInfo 是结构体的名称。这行得通吗?提前致谢

分配数组后(忽略该方法,因为我们不允许使用您提出的方法)我想初始化结构(我构建了一个函数来执行此操作,但它不起作用),我尝试分配后立即执行此操作,并不断收到“未处理的异常”警告,是否必须这样做使用语法,我是否忘记了“*”?

void flightMatrix()
{
FILE * fpf;
int checkScan,Origin,Dest;
float time,cost;
char flightName[3];
flightInfo *** matrix;


if(!(fpf=fopen("flights.txt","r")))exit(1);

while((checkScan=fscanf(fpf,"%*10c%3d%3d%3c%5f%7f%*",&Origin,&Dest,flightName,&time,&cost))!=EOF)
{
matrix=allocateMatrix(Dest);
matrix[Origin-1][Dest-1]->o=Origin;

}

}

flightInfo*** allocateMatrix(int n)

{ int i,j;
flightInfo*** matrix;

matrix=(flightInfo***)malloc(sizeof(flightInfo **)*n);
for(i=0;i<n;i++)
matrix[i]=(flightInfo **)malloc(sizeof(flightInfo*)*n);

for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
matrix[i][j] = NULL;
}

return matrix;
}

[http://i.stack.imgur.com/MFC7V.png]这就是我尝试初始化时发生的情况

最佳答案

从技术上讲,这不会创建二维数组。结果将是指针数组,其中每个指针都指向结构体的不同指针数组。

不同之处在于,内存会碎片化,因此每个元素都会指向某个内存位置,而不是单个连续的内存块。

常见的方法是创建扁平二维数组:

flightInfo** allocateMatrix(int n)
{
flightInfo** matrix = malloc(n*n * sizeof(*matrix));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
matrix[i*n + j] = NULL;
return matrix;
}

如果您被迫使用两个索引,那么您可以将矩阵作为函数参数:

void allocateMatrix(int n, flightInfo* (**matrix)[n])
{
*matrix = malloc(n * sizeof(**matrix));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
(*matrix)[i][j] = NULL;
}

第二个星号是必需的,因为指针是按值传递的,否则您最终会得到指针的修改后的本地副本,这对 main 中的 matrix 没有任何作用功能。

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

typedef struct flightInfo {
char airport[30];
int altitude;
} flightInfo;

void allocateMatrix(int n, flightInfo* (**matrix)[n])
{
*matrix = malloc(n * sizeof(**matrix));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
(*matrix)[i][j] = NULL;
}

int main()
{
int n = 10;
flightInfo* (*matrix)[n];

allocateMatrix(n, &matrix);

matrix[0][0] = malloc(sizeof(flightInfo));
strcpy(matrix[0][0]->airport, "Heathrow");
matrix[0][0]->altitude = 10000;

printf("%s, %d\n", matrix[0][0]->airport, matrix[0][0]->altitude);
}

另一种方法是将数组封装在结构中。

关于c - 如何分配指向结构体的二维指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39487705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com