【问题标题】:How to free allocated memory to an array of pointers after assigning value?赋值后如何将分配的内存释放给指针数组?
【发布时间】:2021-09-24 17:22:38
【问题描述】:

一个简单的初学者的困境,所以应该很快就会明白。

我正在尝试从 char 指针数组内的变量中释放分配的内存

这不会引发错误:

    array= malloc(1*sizeof(char *) + 1);
    array[0] = malloc(2*sizeof(char *));
    free(array[0]);

然而,如果我给它添加一些值,我会得到一个错误:

    array= malloc(2*sizeof(char *));
    array[0] = malloc(2*sizeof(char *));
    array[0] = "a";
    free(array[0]);

(malloc: *** error for object 0x10......: 被释放的指针未被分配 malloc: *** 在 malloc_error_break 中设置断点进行调试)

如何解释以及如何处理?

【问题讨论】:

  • 如果您想将"a" 存储在array[0],请使用strcpy。请注意,这很可能应该是 array[0] = malloc(2*sizeof(char));(而不是 size(char*))。通常,您malloc 的空间应该是您分配的左值的sizeof()。此外,sizeof char 始终为 1,因此一些 SO 用户主张完全省略它,在这种情况下,您将得到 array[0] = malloc(2);
  • 这就解释了。谢谢

标签: c pointers memory-management dynamic-memory-allocation dynamic-arrays


【解决方案1】:

@Adrian Mole 是完全正确的,我只想添加一些关于字符串文字的 cmets。 字符串文字常量位于程序的 .rodata 段中,这是一个预先分配的只读段,占用程序内存空间。在任何情况下,您都不能释放或修改此段中的任何值,所以

array[0] = "a";
array[0][0] = array[0][0] + 1;

也会导致错误。

【讨论】:

    【解决方案2】:

    假设您的 array 是一个指向 字符串 的指针列表(每个字符串都将获取诸如 2 字符 "a" 之类的数据),那么就会出现一些错误在你的方法中。

    首先,array[0](和其他元素)应该分配为sizeof(char) * 2(而不是sizeof(char*) * 2)——这将提供指向缓冲区的指针,每个缓冲区最多可以容纳2个字符(a字母和nul-终结者)。

    所以:

        array= malloc(2*sizeof(char *));    // An array of two char* pointers
        array[0] = malloc(2*sizeof(char));  // One pointer to a 2-character buffer
    //...
    

    然后,当您要将给定字符串分配给其中一个元素时,请使用strcpy 函数,如下所示。您的 array[0] = "a"; 行所做的是将 分配的缓冲区的地址 替换为 字符串文字的地址 - 而且,由于您没有分配它,您可以'不释放它(然后你甚至不能释放你的实际分配的缓冲区,因为你已经“丢失”了它的地址)。

    //...
        strcpy(array[0], "a"); // Copy the second argument's data to the first
        // ... later on ...
        free(array[0]);        // This will now (still) work, as you didn't change the address
        // ...
        free(array);           // And don't forget to free the array of pointers!
    

    还要注意,sizeof(char) 定义(由 C 标准)为 1 个字节,因此您可以在上面第一个 sn-p 的第二行中省略它(但您需要sizeof(char*)的情况下——指针的大小会因平台和编译器而异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多