【问题标题】:Free the memory after it is allocated with calloc() to create an array of strings使用 calloc() 分配内存后释放内存以创建字符串数组
【发布时间】:2021-05-27 15:03:24
【问题描述】:

在使用calloc() 分配内存以创建字符串数组后,我想尝试释放它并确保字符串和字符串指针都被永久删除。

代码如下

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

int main(int argc, char **argv) {
    char **arr;
    arr = calloc(3, sizeof(char *));
    arr[0] = calloc(30, sizeof(char));
    arr[1] = calloc(30, sizeof(char));
    arr[2] = calloc(30, sizeof(char));

    arr[0] = "jhgfdjhgfdjhgfds";
    arr[1] = "oru95u9iojituy";
    arr[2] = "hggpooki0opkopreiyh";

    free(arr[2]); free(arr[1]); free(arr[0]);
    //free(arr[0]); free(arr[1]); free(arr[2]);
    free(arr);
}

正如你最后看到的,我试图释放分配给字符串的内存。在注释行中,我尝试以相反的方向释放内存,认为我必须遵循字符串在数组中出现的顺序。 尽管如此,我总是收到以下错误:

free(): invalid pointer

我无法理解这个问题。我知道每个calloc () / malloc () 必须有其各自的free ()。 arr [i] 中似乎没有内存地址,即使我调用了 calloc。 如何才能完全释放内存?

【问题讨论】:

  • 你不是在释放你分配的内存,而是在尝试释放字符串文字的内存。
  • 你可以使用arr[0] = strdup("jhgfdjhgfdjhgfds");

标签: c


【解决方案1】:
arr[0] = "jhgfdjhgfdjhgfds";
arr[1] = "oru95u9iojituy";
arr[2] = "hggpooki0opkopreiyh";

这实际上并不是用字符串数据填充内存,而是重新分配和覆盖您刚刚使用calloc() 调用创建的指针。 C 中的字符串文字本身被视为指针。如果你想用字符串数据初始化你的指针,使用strcpy:

strcpy(arr[0], "jhgfdjhgfdjhgfds");
strcpy(arr[1], "oru95u9iojituy");
strcpy(arr[2], "hggpooki0opkopreiyh");

【讨论】:

  • 好的,现在一切正常。我明白了这个错误。谢谢
【解决方案2】:

您收到错误消息,因为数组元素不再指向您分配的内存。任务

arr[0] = "jhgfdjhgfdjhgfds";

使它指向字符串文字。

你应该使用

strcpy(arr[0], "jhgfdjhgfdjhgfds");

将文字字符串复制到分配的内存中(其他元素类似)。

【讨论】:

  • 好的,现在一切正常。我明白了这个错误。谢谢
【解决方案3】:

问题在于表达式arr[0] = "jhgfdjhgfdjhgfds"; 获取字符数组“jhgfdjhgfdjhgfds”的地址并将其分配给存储在arr[0] 中的指针。这会覆盖您分配的缓冲区的地址。

您要做的是将这些字母复制到arr[0] 指向的内存中,即您分配的缓冲区。

strcpy_s( arr[0], 30, "jhgfdjhgfdjhgfds" );

请注意,您实际上应该将该值 30 存储在一个常量中,而不是在整个代码中重复它。

【讨论】:

  • 这很有趣。谢谢,现在我明白了。
猜你喜欢
  • 2013-04-15
  • 2017-05-22
  • 2015-06-15
  • 2015-07-07
  • 2016-03-25
  • 2022-01-17
  • 2011-12-09
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多