【问题标题】:changing the pointer in C更改C中的指针
【发布时间】:2015-08-17 13:04:50
【问题描述】:

在编写代码时遇到了一个问题

char* a = malloc (sizeof(char));
a = "blabla";
free(a);

给我一​​个错误,因为我将指针 a 的值更改为其他值。

那么,为什么会这样

char* a = "blabla";
printf("%s", a);

我再次将指针的值更改为blabla,我正在破坏指针地址。应该是错误吧?

【问题讨论】:

  • 不,您没有更改第二个 sn-p 中指针的值。你用一个值初始化它。这与第一个示例有些不同。
  • 当使用字符串字面量时,编译器会给你一个指向只读数组的指针。是什么让您认为将这个指针分配给声明为指针的变量会“破坏”该变量?
  • 第一个sn -p出错的原因不是你改了a的值,而是你改成什么。如果您在第二个末尾添加free(a),您将遇到完全相同的问题。

标签: c pointers malloc


【解决方案1】:

第一种情况有一个错误,因为您将地址传递给free,而不是从malloc 获得的地址。这是一个错误。

第二种情况没有这样的问题,那为什么不工作呢?您并没有“破坏”指针的地址,而是将其设置为有效地址,然后将该有效地址用于有效目的。

第二个例子与:

int i = 1;
printf ("%d", i);

您设置了它的值并以适当的方式使用了新的合法值,所以没问题。

【讨论】:

  • 我会补充答案说,即使在第二种情况下你有一个有效的指针,你也不允许释放内存 free - 因为,你知道,它是一个常量字符串.
【解决方案2】:

在第二个中,您正在创建一个指向字符串文字"blabla" 的指针,它不会以任何方式影响指针,而是创建了一个新指针。在第一个示例中,您更改了指针本身的值。

【讨论】:

  • 这不是代码崩溃的原因。第一个示例崩溃的原因是您传递给free() 一个尚未通过malloc() 获取的指针。
  • 提问者知道为什么free() 会出错;他们在问题中说“因为我将指针 a 的值更改为其他值”。我将问题解释为“为什么示例 2 有效?”,这就是我的回答。
  • 但是将指针值更改为其他值不是问题本身,问题是将指针值更改为既不是NULL指针也不是由malloc()返回。
【解决方案3】:

第一个 sn-p 导致内存泄漏。一旦执行a = "blabla"; 语句,指针a 将不再指向malloc 分配的内存,其地址丢失。

【讨论】:

    【解决方案4】:

    您的地址丢失的第一个 sn-p 存储“blaba”的位置会出错。在第二个中,您直接将值分配给 blabla

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多