c - 访问作为双指针传递给函数的 Typedef 结构指针。函数内部访问

标签 c function pointers memory memory-management

我很难处理对函数内部结构成员的访问,而且结构实例是双指针参数。我正在使用 strcpystrcmp 并且在我看来(我使用调试器)做坏事。

首先,我使用 typedef 创建了结构,实例化了 2 次并为其中一次分配了内存。

其次,我创建了函数 loadVariablesToMemory,我将实例化结构实例作为双指针传递给它(第二行 - 在//Functions 注释之后)。

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

//FUNCTIONS
int loadVariablesToMemory(const char* fileName, const char* fileAccessMode, varData **dynamicData, varData **tmp);



//DECLARATION
typedef unsigned short int UINT16;

typedef struct data {
    char varName[10];
    UINT16  value;
} varData;



int main(){

    //ALLOCATING MEMORY
    varData *dynamicData;
        dynamicData = (varData*)malloc(sizeof(varData));
   varData *tmp;
        tmp = NULL;

   int numOfVars = loadVariablesToMemory("u02v1_input_03.txt", "r", &dynamicData, &tmp);

   return 0;
}

问题: 在函数 loadVariablesToMemory 中,我试图访问上面实例化和声明的结构的分配“变量”,使用:

.....
if(strcmp((*(dynamicalData+j-1))->varName, buffer) == 0){
.....etc.
strcpy((*(dynamicalData+numOfVars-1))->varName, buffer);
.....etc.

我运行调试器,一切似乎都正常工作 [如果我将整个函数重写到 Main 之外,它也可以工作(双指针的变化很小,现在是单指针)] 但我卡在了使用 strcpy 的行中();strcmp() 函数,我不知道为什么,我有点绝望,因为这两个 semm 只是阻止我创建工作函数的两件事,我我越来越绝望,因为我处理这个问题将近 10 个小时,但没有任何实际进展。

完整功能loadVariablesToMemory声明:

int loadVariablesToMemory(const char* fileName, const char* fileAccessMode, varData **dynamicalData, varData **tmpal) {


    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
                            //HERE SEEMS NOT TO WORK - this is just random try if strcpy will work
                            //strcpy((*(dynamicalData+j-1))->varName, buffer);
                            //HERE SEEMS NOT TO WORK
                            if(strcmp((*(dynamicalData+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
                            tmpal = (varData*)realloc((*dynamicalData), numOfVars * sizeof(varData));
                            if(!tmpal) {              //or equal to NULL
                                //printf("Could not resize/reallocate memory %i times \n", numOfVars);
                            }
                            else{
                                dynamicalData = tmpal;
                                strcpy((*(dynamicalData+numOfVars-1))->varName, buffer);
                                printf("%s \n", (*(dynamicalData+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;
}

内部输入文件:u02v1_input_03.txt

0 -> c
va OR dq -> v
NOT cx -> dr
kk RSHIFT 3 -> km
NOT cx -> dq
3 AND v -> fx
lf RSHIFT 2 -> lg

有人可以这么好帮我吗?非常感谢。

最佳答案

尝试这样的事情:

if((varOrNum == 0) && (buffer[0] != '0')) {
    int j;
    for(j = 0; j<numOfVars; j++) {
        if(strcmp(dynamicalData[j]->varName, buffer) == 0)
            break;
    }
    if(j>=numOfVars) {
        numOfVars++;            //number of variables for allocation
        tmpal = (varData*)realloc((*dynamicalData), numOfVars * sizeof(varData));
        if(!tmpal) {              //or equal to NULL
            //printf("Could not resize/reallocate memory %i times \n", numOfVars);
        }
        else{
            dynamicalData = tmpal;
            strcpy(dynamicalData[numOfVars-1]->varName, buffer);
            printf("%s \n", dynamicalData[numOfVars-1]->varName);
        }
    }
}
varOrNum = 0;               //if varOrNum is a number (1)
memset(buffer,'\0',10);

在第一行你错过了 &。 在第一个循环 (j==0) 中,您执行 strcmp dynamicalData+j-1 这意味着 dynamicalData[-1]

关于c - 访问作为双指针传递给函数的 Typedef 结构指针。函数内部访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43736444/

相关文章:

c - 需要插入 C 语言指针和 void 函数的学习

c - 将 char 数组中的信息放入动态创建的数组中

c - 解决 KNKING 练习 14,第 8 章。颠倒单词

c++ - 使用 auto 作为函数返回类型时出错

python - AttributeError: 'function' 对象没有属性 'replace'

python - 是否可以在 Python 中定义一个带点名的函数?

c - 我使用 restrict 限定符时出错

c - 打印变量在内存中的地址

C: Malloc 断言失败

c - 如何让我的 makefile 自动链接库?