【问题标题】:the value of a pointer in a function [duplicate]函数中指针的值[重复]
【发布时间】:2019-08-31 19:08:31
【问题描述】:

您好,我正在学习 C 中的指针,想知道下面的代码是做什么的? 指针*abc 是否只是指向一些随机的东西,因为它没有正确分配变量的地址?

   void func()
   {
      int *abc;
      *abc = 5;
   }

【问题讨论】:

  • 代码在运行时将简单地调用未定义的行为。
  • 这是未定义的行为,因为您在为 abc 分配指针值之前就对其进行了分配。
  • 是的。它指向一些随机的东西。如果它恰好指向有效内存,您将覆盖其他内容。如果不是,您将遇到分段错误并且程序将崩溃。
  • 在一个指针被初始化为指向一个有效的内存位置之前,该指针是一个“未初始化的指针”,它持有一些不确定的地址作为它的值。当您为指针分配一个有效地址时,您初始化指针以指向该有效地址(指针只是一个普通变量,它将内存地址作为其值保存到其他东西,即指针指向该地址)。所以在你的情况下,如果你有int i = 5, *abc = &i;,你初始化abc(让它指向)到内存中存储5的地址。

标签: c pointers


【解决方案1】:

你不能通过分配内存给指针赋值,这会导致分段错误。

int *abc;

上面的语句只会声明一个指向整数的指针,但它不包含任何地址。

int *abc = (int *)malloc(sizeof(int));
*abc = 5;

如果你想直接赋值,你需要用一些内存进行初始化。 只有这样你才能直接分配

【讨论】:

  • *abc = 5; 不一定是分段错误未定义的行为可能导致任何事情。
  • free(abc); 是干净的。
  • 并检查NULL - 如果分配内存发生错误,malloc() 可以返回NULL
【解决方案2】:

如您所述,abc 未正确初始化,因此我们不知道它指向什么。在它可以被可靠地使用之前,它必须被分配一个值,该值是正确保留的内存的地址。您可以通过为其分配一个已定义对象的地址(如int x; int *abc = &x;)或通过诸如malloc 之类的例程请求内存(如int *abc = malloc(sizeof *abc); 并检查结果不是NULL)来为其分配一个值)。

请注意,说它“指向随机的东西”是不正确的。在 C 标准的条款中,它的值是不确定的。这意味着它的值不仅是未指定的,而且每次使用它的程序可能会表现得好像abc 具有不同的值——它不一定表现得好像abc 具有某个随机确定的值。它也可能有一个陷阱表示,它不表示指针类型的值,使用它会导致程序的行为没有被 C 标准定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2015-07-01
    • 2014-01-04
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多