【问题标题】:Assigning a value to a pointer is giving error给指针赋值会出错
【发布时间】:2020-03-29 15:52:31
【问题描述】:

请告诉我这段代码有什么问题,我无法打印值 出现分段错误错误。

int main()
{
  int i=3, *p;
  p = &i+1;
  *p = 30;
  printf(“%d”, *p);
 } 

如果我使用此代码,它工作正常。

int main()
    {
      int i=3, *p, *q;
      q = &i;
      p = q+1;
      *p = 30;
      printf(“%d”, *p);
     } 

感谢您的回复

【问题讨论】:

  • 它们都表现出未定义的行为。无论发生在i 之后,您都在写入内存。当然,你会得到不可预知的结果。这被称为内存损坏,这是一个严重的错误。不要这样做。
  • 在第一个示例中,p = &i + 1; 表示p 将指向存储i 的空间之后的地址。然后你用*p = 30;访问它。

标签: c clang


【解决方案1】:

你应该给p分配内存,否则你会得到随机结果。

【讨论】:

  • 这是错误的。您不一定需要分配内存!您可以将任何有效地址分配给p,并且没有未定义的行为。例如p = &i; 然后*p = 30 是完全正确的。
【解决方案2】:

@Olaf Dietsche 有一个非常好的答案,但由于您使用给定代码提出问题,我假设您不太了解指针和 & 运算符的基础知识。

让我从你的例子开始,你有一个“int”变量和一个指向它的指针:

int a = 10;
int* p = &a;

这段代码的作用是声明一个int 类型的局部变量,然后声明另一个int* 类型的变量。然后使用& 运算符将指针初始化为a 的地址。

您现在必须了解每个变量都存储在其地址并具有一定的价值。这意味着变量var 存储在地址&var 中,并且具有存储在地址&var 的位中的值。这适用于所有变量,包括指针!

在上面的例子中,变量a存储在地址&a,值为10。指针p存储在地址&p,值为&a

如果你打算使用这样的指针,你必须了解局部变量的作用域和生命周期。 例如,在下面的函数中,var 是一个局部变量。仅在函数执行时才在堆栈上分配,然后弹出。

void f()
{
    int var = 10;
    var = var + 5;
} // <-- scope of the function is exited. var is popped from the stack.

您可以使用指针来保存局部变量的地址。但是,您需要注意,如果退出范围,则其中定义的变量不存在记录器。任何持有这些变量地址的指针都不会改变它们的值,但会指向用于其他用途的地址。例如:

int main()
{
    int* p;

    // now we create a scope
    {
        int a = 10;
        p = &a;
    }

    // this is undefined behaviour.
    printf("%d", *p);

    return 0;
}

即使代码可以无误地编译和运行,但它是不正确的。如果你运行它,什么都不能保证输出是什么,因为a的地址在作用域退出时已经被释放,并将用于在堆栈上存储其他东西。

为什么您的第一个示例会崩溃? @Olaf Dietsche 在他的回答中解释了这一点。

为什么您的第二个示例没有崩溃?这与我的上一个示例类似。它会编译并运行,但你无法保证会发生什么。

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2013-07-13
    • 2019-10-31
    相关资源
    最近更新 更多