Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为结构分配内存,并将其作为指针参数传递给函数进行填充,但程序离开后函数内存丢失_C_Pointers_Memory_Memory Management - Fatal编程技术网

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

C 为结构分配内存,并将其作为指针参数传递给函数进行填充,但程序离开后函数内存丢失,c,pointers,memory,memory-management,C,Pointers,Memory,Memory Management,我对C有点熟悉,但我还有很多东西要学,我现在有点问题。我正在尝试从txt文件中读取一些特定变量(特定文本),并将其存储在我分配内存的结构中,然后处理我获得并保存在分配结构中的数据,并在运行时更改变量值以获得正确答案 到目前为止,我已经完成了第一部分。。从文件中分配和读取变量,然后在必要时为每个变量动态重新分配现有内存,对于这些变量,当前内存(重新分配前)很小,需要保存在其中 我声明了结构varData,实例化了2次,并在MAIN func中为其中一个分配了内存: varData *dynamic

我对C有点熟悉,但我还有很多东西要学,我现在有点问题。我正在尝试从txt文件中读取一些特定变量(特定文本),并将其存储在我分配内存的结构中,然后处理我获得并保存在分配结构中的数据,并在运行时更改变量值以获得正确答案

到目前为止,我已经完成了第一部分。。从文件中分配和读取变量,然后在必要时为每个变量动态重新分配现有内存,对于这些变量,当前内存(重新分配前)很小,需要保存在其中

我声明了结构
varData
,实例化了2次,并在MAIN func中为其中一个分配了内存:

varData *dynamicData;
       dynamicData = (varData*)malloc(sizeof(varData));
varData *tmp;
       tmp = NULL;
然后,我创建了一个函数
loadVariablesToMemory
,在这个函数中,我读取文件,在文本中标识变量,并重新分配内存(当前内存不足),以便存储其他变量

当我在函数
loadVariablesToMemory
中运行调试时,一切正常。内存
dynamicata
中充满了变量名,但一旦程序离开函数,内存就会丢失,或者内存中有垃圾,我不知道为什么?一旦程序从函数中跳出,内存中的所有数据都将丢失,并且内存中存在垃圾

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;
}
内部条件
if(match==false)
我正在通过指针重新分配内存,并将缓冲区中的“字符串”复制到新分配的部分,然后将其打印到控制台。在程序离开函数和返回值之前,一切正常。我从内存中丢失了数据

在这里,有谁能帮助我如何在参数中使用这些指针从函数中获取值,并且在函数结束后不丢失它?因为现在它并没有告诉我为什么在我通过指针返回数据时内存中的数据会丢失

如果我把这个函数重写成MAIN中的基本代码,它就可以工作了


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

@xing是对的,而且,tmp参数是无用的,您可以在使用
realloc()
时声明它,但我现在应该如何访问已分配的结构成员?到目前为止,我一直通过以下方式访问它们:
strcpy((dynamicata+numovars-1)->varName,buffer)但是现在当参数中的
dynamicData
是指向指针的指针时,我不确定如何访问特定地址中的结构成员<代码>strcpy((*dynamicata+numovars-1)->varName,buffer)现在似乎没有做这项工作。我对指针对指针的东西是完全陌生的。Damn@xing是正确的,而且,tmp参数是无用的,您可以在使用
realloc()
时声明它,但是我现在应该如何访问已分配的结构成员?到目前为止,我一直通过以下方式访问它们:
strcpy((dynamicata+numovars-1)->varName,buffer)但是现在当参数中的
dynamicData
是指向指针的指针时,我不确定如何访问特定地址中的结构成员<代码>strcpy((*dynamicata+numovars-1)->varName,buffer)现在似乎没有做这项工作。我对指针对指针的东西是完全陌生的。该死
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;
}