【问题标题】:Passing pointers into another function in C将指针传递给 C 中的另一个函数
【发布时间】:2013-10-28 22:57:51
【问题描述】:

假设我有一个变量

int * foo;

我把这个变量传入

func(int *x)
{
  *x = bar;
}

但是,这不起作用。但是,如果我放置一个非指针(比如将其更改为 int foo;)并直接放入地址,则可以。

为什么我的第一个案例不起作用?

谢谢!

【问题讨论】:

  • 因为你没有指向任何东西。
  • 告诉我们你如何称呼func()
  • 你必须显示所有的代码。提供 SSCCE。
  • *foo 必须指向一些分配的内存。
  • 如果我将我的 int * foo 设置为 NULL?这有帮助吗?

标签: c pointers dereference


【解决方案1】:

您的代码也完全按照您的指示行事。但是,int *foo 不分配任何存储空间。指针只是一个内存地址的句柄。在这种情况下,它是任意的并导致未定义的行为。请尝试以下方法。

void func(int *x) {
   *x = 42;
}

int main(int argc, char** argv) {
    int *foo;
    int  storage;

    foo = &storage;
    func(foo);
    printf("%d\n" storage);

    return 0;
}

foo 只是一个指向storage 的指针,它由运行时在堆栈上分配。在这种情况下,您也可以使用 foo(&storage)

【讨论】:

    【解决方案2】:

    通过声明 int * foo 你只创建了一个指针。 foo 实际上还没有指向任何东西——它是未初始化的。您甚至可能从这样的代码中得到分段错误,因为指针可能指向程序内存之外。如果你这样做:

    int * foo = (int *)malloc(sizeof(int));
    

    您将初始化指针,malloc 从传递给它的大小的堆中分配一些内存。你也可以这样做:

    int bar = 0;
    int * foo = &bar;
    

    这将使 foo 成为指向 bar 的指针(& 返回变量的地址)。

    【讨论】:

      【解决方案3】:

      你应该这样做

      int bar = 235; // any value you want
      
      void func(int *x)
      {
          *x = bar;
      }
      
      int main()
      {
          int *foo;
          foo = (int*)malloc(sizeof(int));
          func(foo);
      
          printf("%d", *foo);
          free(foo);
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        相关资源
        最近更新 更多