我对C有点熟悉,但我还有很多东西需要学习,现在我有一点问题。我正在尝试从txt文件中读取一些特定的变量(特定文本)并将其存储在我分配内存的结构中,然后使用我获得的数据并保存在已分配的结构中,并在运行时更改变量值以获得正确答案。
到目前为止,我已经完成了第一部分..从文件中分配和读取变量,然后必要时为每个变量动态重新分配现有内存,当前内存(重新分配之前)很小,以便保存在其中。
我声明了结构varData
,实例化了2次并在MAIN func中为其中一个分配了内存:
varData *dynamicData;
dynamicData = (varData*)malloc(sizeof(varData));
varData *tmp;
tmp = NULL;
然后,我创建了一个函数loadVariablesToMemory
,其中我正在读取文件并在文本中标识变量并重新分配内存(当前内存不足),以便存储其他变量。
我运行调试,当我进入函数loadVariablesToMemory
时,一切正常。内存dynamicData
填充了变量名,但是一旦程序离开函数,内存就会丢失或垃圾就在其中,我不知道为什么?一旦程序从函数中跳出,内存中的所有数据都会丢失并且垃圾就在其中。
typedef struct data {
char varName[10];
int value;
} varData;
#include "functions.h"
int main()
{
//ALLOCATING MEMORY
varData *dynamicData;// = malloc(sizeof(varData));
dynamicData = (varData*)malloc(sizeof(varData));
varData *tmp;// = NULL;
tmp = NULL;
//tmp = (varData*)realloc(dynamicData, sizeof(varData));
int numOfVars = loadVariablesToMemory("u02v1_input_03.txt", "r", dynamicData, tmp);
printf("%i \n", numOfVars);
for (int k = 0; k<=numOfVars-1; k++) {
printf("%s \n", (dynamicData+k)->varName);
}
return 0;
}
函数loadVariablesToMemory
如下所示:
int loadVariablesToMemory(const char* fileName, const char* fileAccessMode, varData *dynamicData, varData *tmp) {
FILE *fSource = fopen(fileName, fileAccessMode);
char oneChar = '\0';
char buffer[10];
memset(buffer,'\0',10); //inicialization of buffer chars to \0
int i = 0;
int varOrNum = 0;
int numOfVars = 0;
bool match = false;
while (!feof(fSource)) {
oneChar = fgetc(fSource); //Load letter in file
if((oneChar == ' ') | (oneChar == '\n')) {
i = 0;
if((strcmp(buffer,"NOT") == 0) || (strcmp(buffer,"AND") == 0) || (strcmp(buffer,"OR") == 0) || (strcmp(buffer,"LSHIFT") == 0) || (strcmp(buffer,"RSHIFT") == 0) || (strcmp(buffer,"->") == 0)) {
memset(buffer,'\0',10);
}
else{
varOrNum = atoi(buffer); //returns (0) if varOrNum is variable (0)
if((varOrNum == 0) & (buffer[0] != '0'))
{ //if varOrNum is a variable (0)
for(int j = 0; j<=numOfVars; j++) { //control in memory for match of variable name
if(strcmp((dynamicData+j-1)->varName, buffer) == 0){
memset(buffer,'\0',10);
match = true; //match found
break;
}
else
match = false; //no match found
} //endForCycle
if(match == false){ //no match found
numOfVars++; //number of variables for allocation
tmp = (varData*)realloc(dynamicData, numOfVars * sizeof(varData));
if(!tmp) { //or equal to NULL
//printf("Could not resize/reallocate memory %i times \n", numOfVars);
}
else{
dynamicData = tmp;
//printf("Reallocated memory %i times \n", numOfVars);
strcpy((dynamicData+numOfVars-1)->varName, buffer);
printf("%s \n", (dynamicData+numOfVars-1)->varName);
}
}
}
varOrNum = 0; //if varOrNum is a number (1)
memset(buffer,'\0',10);
}
}
else{
buffer[i] = oneChar;
i++;
}
} //endWhileCycle (!feof(fSource))
fclose (fSource);
return numOfVars;
}
内部条件if(match == false)
我通过指针重新分配内存并从缓冲区复制到新分配的部分“字符串”之后我将其打印到控制台。一切正常,直到程序离开函数并返回值,我从内存中丢失了数据。
有人可以帮我这里如何在参数中使用这些指针从函数中获取值而不是在函数结束后松散它?因为现在它并没有让我感觉到为什么内存中的数据会丢失,因为我通过指针返回它们。
如果我将此功能重写为MAIN中的基本代码,则可行。
非常感谢您的帮助。我完全绝望了。