当我们将值重新分配给char指针时,内存会发生什么?

时间:2019-12-14 13:40:04

标签: c memory-management memory-leaks

我想知道当我们做这样的事情时,内存内部会发生什么

  char *s;
  s = "Text";
  s = "Another Text";

如果我做对了,则通过将字符串分配给char指针来动态分配内存。所以根据我的理解赋值表达式

  s = "Text";

等于

  s = (char *) malloc(5); // "Text" + '\0'
  strcpy(s, "Text");

好吧,这样我们可以通过使用

轻松释放内存
  free(s);

但是...在将相同的指针重新分配给另一个值之后,它会分配新的内存段来存储该值。

  s = "Text";
  printf("\n(%p) s = \"%s\"", s, s);

  s = "Another Text";
  printf("\n(%p) s = \"%s\"", s, s);

输出:

  (0x400614) s = "Text"
  (0x400628) s = "Another Text"

这意味着旧值的地址不再对我们可用,我们也无法再释放它。再次调用free(s);可能只会释放该指针使用的最后一个内存段。

我的问题是:如果我们一次又一次地重新分配相同的char指针,它在运行时会消耗越来越多的程序内存还是会以某种方式自动释放垃圾?

我希望这足以说明我的问题,想不出更好的例子。如果不清楚的地方,请要求其他说明。

3 个答案:

答案 0 :(得分:1)

您的理解是错误的。这只是分配,它不会分配任何内存。在您的示例中,您为指针分配了字符串文字的地址。字符串文字会在编译时创建并放置在只读内存中

您现在确实通过分配指针来分配任何内存

答案 1 :(得分:1)

这不等于执行malloc。发生的情况是字符串文字存储在内存的只读部分中。而且分配的不是指针的分配。程序中的所有字符串文字都已从头开始分配。

也许值得一提的是,严格来讲它们不是存储在只读存储器中,而是可能存在,并且写入字符串文字是未定义的行为。

您不能也不应该免费调用字符串文字。可以,但是该程序可能会崩溃。

答案 2 :(得分:1)

  • 未经优化,编译器将为字符串文字“ text1”和“ text2”保留两个不同的内存空间。

  • 如果赋值行在您的问题中非常连续,并且如果在第一个赋值行之后未执行任何操作(假设使用优化进行编译),则编译器很可能不会为第一个字符串文字分配任何空间,也不会产生第一个分配行的任何操作码。