这是我到目前为止所取得的成就,但是我不知道那是对的。此函数接收2D数组的尺寸(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]这是我尝试初始化时发生的情况
从技术上讲,这不会创建2D数组。结果将是一个指针数组,其中每个指针都指向一个结构的不同指针数组。
区别在于,内存将是零散的,因此每个元素都将指向某个内存位置,而不是单个连续的内存块。
常见的方法是创建扁平2D数组:
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;
}
第二个星号是必需的,因为指针是按值传递的,否则您将得到修改后的指针的本地副本,这对matrix
frommain
函数没有作用。
#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);
}
另一种方法是将数组封装在结构中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句