【问题标题】:Pointers as a return value [closed]指针作为返回值
【发布时间】:2015-09-02 17:38:33
【问题描述】:

如果我创建了对两个变量求和并通过指针返回求和结果的函数。

该算法可能会出现哪些预期问题?

【问题讨论】:

  • 未定义的行为,因为您将地址返回给局部变量。
  • 您是在询问“算法”,还是您有任何会导致麻烦的特定代码?因为如果您有代码,您应该将其展示给我们,以便我们帮助您解决您遇到的问题。
  • 显示一些代码,这样我们就不需要猜测您的问题是什么了。
  • int* sum(int x, int y){ int z; z=x+y; int *p=&z;返回 p;该代码的预期问题是什么?
  • @Eman:我已经在我的回答中提到了这一点。

标签: c pointers function-pointers


【解决方案1】:

预期的问题

  • 未初始化的指针

    void add(int a, int b, int * pc)
    {
      *pc = a + b;
    }
    
    int main(void)
    {
      int a = 1;
      int b = 2;
      int * pc;
    
      add(a, b, pc);
    
      ...
    

    问题:pc 指向“无处”。

  • 内存对齐错误

    void add(int a, int b, int * pc)
    {
      *pc = a + b;
    }
    
    int main(void)
    {
      int a = 1;
      int b = 2;
      char c[sizeof (int)];
    
      add(a, b, c); /* or even add(a, b (int*) c); */
    
      ...
    

    问题:虽然足够大,但 c 的内存可能无法正确对齐以容纳 int

  • 内存无效

    void add(int a, int b, int * pc)
    {
      int c = a + b;
      pc = &c;
    }
    
    int main(void)
    {
      int a = 1;
      int b = 2;
      int * pc;
    
      add(a, b, pc);
    
      ...
    

    问题:从add() 返回时,pc 指向无效内存,因为已被释放,即指向位于add() 堆栈上的c

【讨论】:

    【解决方案2】:

    如果你这样做没问题:

    void sum(int a, int b, int *res)
    {
      *res = a+b;  
    }
    

    例如调用如下:

     int x;
     sum(5, 6, &x);
    

    但以下不正确:

    int* sum(int a, int b)
    {
      int *res;
      int x = a+b;
      res = &x;
      return res;// returning address of x - but x is not alive when function ends; don't do it
    }
    

    PS。你也可以使用malloc,将结果(a+b)存储在那个内存中(通过将a+b分配给*res),然后返回那个指针,但是调用者需要释放它。

    【讨论】:

      【解决方案3】:

      如果结果在堆栈上(即在您的函数中本地声明),则指针将指向一个变量,一旦进行进一步的函数调用,该变量将被覆盖。

      在某些情况下它可能会起作用(即立即从函数返回并在进一步堆栈帧被推送之前获取值) - 但一般来说这是错误的/错误的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 2016-07-24
        • 2017-10-15
        相关资源
        最近更新 更多