gpt4 book ai didi

c - 在递归函数中传递指向结构的指针

转载 作者:行者123 更新时间:2023-11-30 20:37:39 25 4
gpt4 key购买 nike

我在递归函数中传递指针时遇到问题。

我的源代码片段是:

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

#include "../Toolbox/Toolbox.h"
#include "../Toolbox/Reader.h"

#define NUM_OF_GRIDS 100
#define FILE_NAME_LEN 256
#define LINE_LEN 121

typedef struct{
int ID;
double Local_XYZ[3];
double XYZ[3];
int PosCoord;
int Include;
int Module;
int ModNum;
} Type_Grid;


void Read_File(
char* ,// Name of the file to be read
int*,//memory factor for Grids
int*,//Number of Grids
Type_Grid*//Struct Grid
);



int main( void ) {

char InputFileName [FILE_NAME_LEN] = "test.bdf";

int MemFacGrid = 1;

int AnzGrid = 0;

Type_Grid* Grid;

Grid = (Type_Grid*) calloc (NUM_OF_GRIDS, sizeof(Type_Grid) );

//###############################################################################################

Read_File(
InputFileName,
&MemFacGrid,
&AnzGrid,
Grid
);

printf("reading completed\n\n");
printf("AnzGrid %i @ %p\n",AnzGrid,Grid);

return EXIT_SUCCESS;
}
//
//###############################################################################################
//
// READ_FILE
//
//###############################################################################################
//

void Read_File(
char* InputFileName,
int* MemFacGrid,
int* AnzGrid,
Type_Grid* Grid
){

Type_Grid* tmpGrid;

char Line[LINE_LEN] = "\0";
char* Token=NULL;
FILE * File = NULL;

File = fopen(InputFileName,"r");

if (!File){
printf("%s not found!\n",InputFileName);
return ;
}else{
printf("reading %s \n",InputFileName);
}
//if (!File)

while (fgets(Line,LINE_LEN,File)){

if (Line[0] == '$') continue;

if (strncmp(Line,"INCLUDE ",8) == 0){
Token=strtok(Line,"'");
Token=strtok(NULL,"'");

printf("reading INCLUDE %s \n",Token);

Read_File(
Token,
MemFacGrid,
AnzGrid,
Grid
);

}//if (strncmp(Line,"INCLUDE ",8) == 0)

//
//###############################################################################################
//

if ( strstr(Line,"GRID") ){
Grid[(*AnzGrid)].ID = atoi(Entry.Field[1]);
Grid[(*AnzGrid)].PosCoord = atoi(Entry.Field[2]);
Grid[(*AnzGrid)].Local_XYZ[0] = atof(Entry.Field[3]);
Grid[(*AnzGrid)].Local_XYZ[1] = atof(Entry.Field[4]);
Grid[(*AnzGrid)].Local_XYZ[2] = atof(Entry.Field[5]);

if (Grid[(*AnzGrid)].PosCoord == 0){
Grid[(*AnzGrid)].XYZ[0] = atof(Entry.Field[3]);
Grid[(*AnzGrid)].XYZ[1] = atof(Entry.Field[4]);
Grid[(*AnzGrid)].XYZ[2] = atof(Entry.Field[5]);
}//if (Grid[(*AnzGrid)].PosCoord == 0)

(*AnzGrid)++;

if ( (*AnzGrid) >= NUM_OF_GRIDS * (*MemFacGrid)) {

printf("Number of GRIDs exceeded %i * %i @ %p ==> reallocate new memory\n", (*MemFacGrid), NUM_OF_GRIDS , Grid);

(*MemFacGrid)++;

printf(" new size for GRID is %i * %i\n", (*MemFacGrid), NUM_OF_GRIDS );

tmpGrid = (Type_Grid*) realloc (tmpGrid, ( NUM_OF_GRIDS * (*MemFacGrid) ) * sizeof(Type_Grid) );

if (tmpGrid != NULL) {

printf(" new adress for GRID is %p \n", tmpGrid);
Grid=NULL;
Grid=tmpGrid;

}else{

printf("##### REALLOC error in line %i \n", __LINE__);

}//if (tmpGrid != NULL)

}//if ( (*AnzGrid) >= NUM_OF_GRIDS * (*MemFacGrid))

}//if ( mystrstr(Key,Keyword) )

}// while (fgets(Line,121,File)){


fclose(File);

return ;

}


抱歉,不发送Toolbox.h和Reader.h(两者都使用Inputfile的语法规则来帮助填充结构“ Entry.Field [x]”),但是可以看到主要的逻辑。

输入文件的结构是,有一些信息存储到关键字GRID,并且可以通过关键字INCLUDE构造包含一个或多个其他文件的文件。

每当检测到INCLUDE时,我都会使用递归方法将其打开。

我的问题是内存:每次GRID条目的数量超过NUM_OF_GRIDS个,我想按* NUM_OF_GRIDS个因子重新分配内存。

直到NUM_OF_GRIDS大到足以保留所有条目而无需使用realloc为止,此方法才能正常工作。

如果NUM_OF_GRIDS太小,我会遇到核心转储。

标准输出给出:

阅读test.bdf

读取包含test1.bdf

读取test1.bdf

GRID数量超过1 * 100 @ 0xed6010 ==>重新分配新内存

GRID的新大小为2 * 100

GRID的新地址为0xed80c0

GRID数量超过2 * 100 @ 0xed6010 ==>重新分配新内存

GRID的新大小为3 * 100

*检测到glibc * ./test:realloc():无效的指针:
0x00007fff102aa890 ***

可以看到,即使完成重新分配,指向GRID的指针的原始地址也没有改变。知道我有一些东西可以定义为“指向指针的指针”,但是我该如何处理将信息存储到我的结构中呢?

如果这样做,这将有助于避免无效指针吗?

提前致谢...

最佳答案

您的问题是您通过值将Grid参数传递给Read_File函数(这是在C中传递参数的唯一方法),但是随后将其分配给函数内部的Grid变量,并且期望更改调用函数时使用的变量。

通过按值传递指针,您将创建原始指针的副本,并且您知道修改副本不会修改原始指针。因此,当您在Grid函数内分配给Read_File变量时,仅修改函数中的副本,而不修改调用函数时使用的变量。因此,当Read_File返回时,

您已经知道如何在c中模拟按引用传递,如int参数的两个指针所示。您需要对Grid参数执行相同的操作,将指针传递给该指针。

关于c - 在递归函数中传递指向结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32180613/

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