【问题标题】:malloc: *** error for object 0x120e06884: pointer being freed was not allocatedmalloc:对象 0x120e06884 的 *** 错误:未分配被释放的指针
【发布时间】:2021-07-23 10:05:50
【问题描述】:

我已经写了一些代码来查找字符串中字符重复的次数。考虑2个指针并动态分配内存,然后将字符串输入其中一个指针。然后将没有冗余的字符复制到另一个指针中最后比较它,增加计数并打印到屏幕上。

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

void string_cpy(char *from, char *to);
int len(char *p);

int main()
{
    char *name, *copy, *hold;
    int i, j, lent, count = 0, length;

    name = (char *)calloc(25, sizeof(char));
    copy = (char *)calloc(25, sizeof(char));

    printf("Give a string:");
    scanf("%s", name);
    puts("");

    string_cpy(name, copy);
    hold = name;
    lent = len(copy);   //l=4
    length = len(name); //lenght = 5
    printf("Characters and their corresponding frequencies\n");

    for (i = 0; i < lent; ++i)
    {
        for (j = 0; j < length;)
        {
            if (*(copy) == *(name))
            {
                ++count;
                ++name;
                ++j;
            }
            else
            {
                ++j;
                ++name;
            }
        }
        name = hold;
        printf("%c-%d\n", *(copy), count);
        count = 0;
        ++copy;
    }

    free(name);
    free(copy);

    return 0;
}

void string_cpy(char *from, char *to)
{
    int i, j, k, l, ex;
    char key;
    l = len(from); //l=5
    char *t = to;

    for (i = 0, j = 0; i < l; ++i)
    {
        key = *(from + i);
        ex = 0;
        for (k = 0; k < i; ++k)
        {
            if (*(to + k) == key)
            {
                ex = 1;
            }
        }
        if (!ex)
        { //if(ex==0)
            strcpy((to + j), (from + i));
            ++j;
        }
    }
}

int len(char *p)
{
    int leng = 0;
    while (*p != '\0')
    {
        ++leng;
        ++p;
    }
    return leng;
}

当我尝试释放()两个指针或 '''char *copy''' 时,它会抛出一个错误 ->malloc:对象 0x120e06884 的 *** 错误:未分配被释放的指针 ->malloc: *** 在 malloc_error_break 中设置断点进行调试

这是在我的 Mac OS 上完成的

【问题讨论】:

  • 例如,您正在更改 main ++name; 中的指针名称。所以在那之后指针不再指向分配的内存。

标签: c


【解决方案1】:

您更改了calloced 指针的值。它不再引用分配的内存块。

++copy;

【讨论】:

  • 那内存不会浪费吗?指针会发生什么?可以更具体一点。此外,这个问题只在 Mac 上出现,而在 windows 上没有,这是为什么呢?
  • @SushanthAmbati 只需保留已分配内存块的引用并将此引用传递给 free。没有什么比这更“具体”了。
  • @SushanthAmbati 每个由malloccallocrealloc 返回的指针必须通过调用free 来释放。如果您传递的不是这三个函数之一返回的指针,您将得到未定义的行为(主要是崩溃或其他错误消息)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2013-09-17
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多