c - 释放分配的内存时堆损坏

标签 c dynamic-allocation heap-corruption

我正在编写小型学校项目,并且遇到了无法修复的错误。当我尝试释放分配的内存时,出现此错误:

Heap Corruption Error

这是涉及我的char指针temp的代码:

<强>1。内存分配及起始值设置:

 char *temprijec(int rng, RIJEC *B, int *len) {
    int i;
    char *temp=(char*)calloc(*len + 1, sizeof(char));
    *len = strlen((B + rng)->rijec);
    for (i = 0; i < *len; i++) {
        if (i == 0) {
            temp[i] = (B + rng)->rijec[i];
        }
        else if (i == (*len)) {
            temp[i] = '\0';
        }
        else {
            temp[i] = '_';
        }
    }
    return temp;
 }

<强>2。使用字符指针temp:

void tijek_igre(char*temp,RIJEC *B,int rng,int len,int*br2pok,int *pokpogreska,int *pokbr,char*pokch) {
    int i;
    printf("\nPogodi slovo ili rijec!");
    *pokch = _getch();
    for (i = 0; (B + rng)->rijec[i] != '\0'; i++) {
        if (*pokch == (B + rng)->rijec[i]) {
            temp[i] = *pokch;
        }
    }
    for (i = 0; (B + rng)->rijec[i] != '\0'; i++) {
        if (*pokch != (B + rng)->rijec[i]) {
            (*br2pok)++;
            if (*br2pok == len) {
                (*pokpogreska)++;
            }
        }
    }
    for (i = 0; temp[i] != '\0'; i++) {
        if (temp[i] != '_') {
            (*pokbr)++;
        }
    }
}

一切都很好,直到我尝试使用 free(temp); 释放它

最佳答案

我通过更改将变量传递给函数、结构而不是指针的方式修复了错误,现在它可以工作了,我不知道为什么但它可以工作:)。Tnx大家寻求帮助。

更改的代码:

VARIJABLE temprijec(VARIJABLE V, RIJEC *B) {
    int i;
    V.len = strlen((B + V.rng)->rijec);
    V.temp = (char*)calloc(V.len + 1, sizeof(char));

    for (i = 0; i < V.len + 1; i++) {
        if (i == 0) {
            V.temp[i] = (B + V.rng)->rijec[i];
        }
        else if (i == (V.len)) {
            V.temp[i] = '\0';
        }
        else {
            V.temp[i] = '_';
        }
    }
    return V;
}

VARIJABLE tijek_igre(RIJEC *B, VARIJABLE V) {
    int i;
    printf("\nPogodi slovo ili rijec!");
    V.ch = _getch();
    for (i = 0; (B + V.rng)->rijec[i] != '\0'; i++) {
        if (V.ch == (B + V.rng)->rijec[i]) {
            V.temp[i] = V.ch;
        }
    }
    for (i = 0; (B + V.rng)->rijec[i] != '\0'; i++) {
        if (V.ch != (B + V.rng)->rijec[i]) {
            (V.pogresno_slovo)++;
            if (V.pogresno_slovo == V.len) {
                (V.pogreska)++;
            }
        }
    }
    for (i = 0; V.temp[i] != '\0'; i++) {
        if (V.temp[i] != '_') {
            (V.tocno_slovo)++;
        }
    }
    return V;
}

关于c - 释放分配的内存时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49637454/

相关文章:

c++ - 指向数组第一个元素的指针的地址?

c++ - 错误 : invalid operands of types 'const char [3]' and 'int*' to binary 'operator*'

c - 动态分配多维数组

c - 动态分配数组与使用全局作用域自动声明数组(C 语言)

c++ - (不是)指针调整破坏了我的一天和堆? (C++)

无法在 C 中释放重新分配的内存

c++ - C++中堆的损坏

c - 如何使用 FCGI 检测客户端终止的连接?

c - 在 C 中不使用 va_list 访问可变参数函数的参数

c - 如何使用 fork() 从 child 创建子进程?