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

问题描述 投票:0回答:3

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

  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指针,它在运行时是否会消耗越来越多的程序内存,或者以某种方式自动释放了垃圾?

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

c memory-management memory-leaks
3个回答
1
投票

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

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


1
投票

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

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

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.