为结构分配内存并将其作为指针参数传递给函数来填充,但是在程序离开后函数内存丢失

时间:2017-05-01 21:00:11

标签: c pointers memory memory-management

我对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中的基本代码,则可行。

非常感谢您的帮助。我完全绝望了。

0 个答案:

没有答案