变量的值在C程序中不会改变

时间:2014-01-02 17:37:54

标签: c arrays dynamic struct

我正在为我的大学写一个项目。我必须实现这个问题的功能。在这个函数中,我必须为结构数组分配内存,每次数组填充时,我必须用双倍空间重新分配数组。每个结构都有两个成员。第一个成员是一个char指针,我必须输入一个字符串。我必须继续这样做,直到用户输入END作为字符串输入。之后,我必须释放已分配且未使用的内存。例如,假设我分配了16个结构,并且我只使用了10个。我必须释放其余6个结构的内存。我做了所有这些,除了我必须释放记忆的部分。 Ι有一个变量,其中我记录了使用的结构数量。我的问题在于这个变量。出于某种原因,此变量的值保持不变。我花了几个小时试图找到原因,但我不明白为什么会发生这种情况。我也搜索过,我没有发现任何类似的东西来解决我的问题。这是我的代码。我很感激你的帮助。

struct nameInfo {
char *name;
char *replacement;

};

nameInfoT *readNames(int *megethos) {

nameInfoT *infos;
int i = 0; //metriths pou deixnei se poio struct tou pinaka infos anaferomaste
char formatstr[15], buffer[SIZE];
int current_size = 0;
int initialized_structs = 1;
nameInfoT *tmp;

sprintf(formatstr,"%%%ds", SIZE -1);

infos = (nameInfoT *)malloc(sizeof(nameInfoT));
if (infos == NULL) {
    printf("There was a problem allocating memory\n");
    exit(1); //epistrofh se periptwsh pou den mporei na ginei dianomh mnhmhs.
}
for  (i = 0; ;i++) {
    scanf(formatstr,buffer);
    if (strcmp(buffer, "END") == 0) {
        break;
    }


    if ((current_size == initialized_structs) && (initialized_structs != 1)) {
        initialized_structs *=2;
        tmp = realloc(infos, (sizeof(nameInfoT) * 2 * initialized_structs));
        if (tmp == NULL) {
            printf("Error allocating Memory");
            exit(1);
        }
        infos = tmp;
        initialized_structs *=2;



    }


    infos[i].name = strdup(buffer);
    if (infos[i].name == NULL) {
        printf("There was a problem allocating memory\n");
        exit(1);
    }
    current_size++;

}

printf("Initialized structs number is: %d", initialized_structs);
*megethos = current_size; // anathesh sthn timh tou pointer pou tha epistrafei mesw twn parametrwn,
                            //to plhthos twn structs pou xrhsimopoiountai

return infos;

}

2 个答案:

答案 0 :(得分:0)

您应该尝试使您的代码更有条理和可读,并为不同目的使用明显不同的部分和功能。

这段代码对我来说似乎不对:

if ((current_size == initialized_structs) && (initialized_structs != 1)) {
    initialized_structs *=2;
    tmp = realloc(infos, (sizeof(nameInfoT) * 2 * initialized_structs));
    if (tmp == NULL) {
        printf("Error allocating Memory");
         exit(1);
    }
    infos = tmp;
    initialized_structs *=2;
}

条件(initialized_structs != 1)不允许执行此代码,因为initialized_structs是1.此外,您正在调用initialized_structs *=2;两次,这只是正确的,因为realloc需要 current_size的四倍(你已经在realloc之前加倍initialized_structs,然后再将它再乘以2)。

它应该是这样的:

if (current_size == initialized_structs) {
    initialized_structs *= 2;
    tmp = realloc(infos, (sizeof(nameInfoT) * initialized_structs));
    if (tmp == NULL) {
        printf("Error allocating Memory");
         exit(1);
    }
    infos = tmp;
}

答案 1 :(得分:0)

问题是

  && (initialized_structs != 1)

我不确定你为什么拥有它,但由于initialized_structs仅在该块内更改并初始化为1,因此该条件必须始终失败。< / p>


在一个不相关的说明中,你实际上每次都会将分配的内存翻两番。