【问题标题】:Example of Pointers dealing with Stack variables处理堆栈变量的指针示例
【发布时间】:2015-10-18 12:51:09
【问题描述】:

我在Pointers上浏览了这一章,偶然发现了这句话:

您将使用指针来处理已分配的变量 在堆上。 (您可以使用指针来处理堆栈变量,但是 在大多数情况下,这是没有必要的)。

我知道如何使用指针来处理已在堆上分配的变量。但我无法想象它如何用于处理堆栈变量。由于堆栈变量在函数退出时会自动释放(即变量被推出堆栈),如何在不使用 free 系统调用之类的东西的情况下使用指针(如上面引用的文本所暗示的那样)完成相同的操作?这可能吗?

【问题讨论】:

  • 您想对堆栈变量做什么“相同”?
  • "使用指针" != "调用free"
  • 不清楚您遇到了什么问题。但是你可以让一个指针指向一个堆栈变量。指针与它们指向的对象的存储类型正交。
  • 我认为作者通常是在谈论使用带有局部变量的指针,而不仅仅是从函数返回指针。
  • 在栈上分配的变量是在内存中分配的(虽然是静态的而不是动态的),因为栈本身位于内存中。所以这个变量有一个可以通过指针访问的内存地址。例如:声明int a, *p = &a,并赋值*p = 5

标签: c pointers stack


【解决方案1】:

您可以使用 address-of 运算符 & 获取局部变量的地址(分配在堆栈上)。然后可以将该地址存储在指针中,并像指向堆上的变量一样使用它。但是,您不应该free() 存储的地址,因为这构成了未定义的行为。

【讨论】:

    【解决方案2】:

    简单示例:

    int i;
    scanf("%d", &i);
    

    指向堆栈变量i 的指针被传递给scanf(),以便将结果存储在那里。

    【讨论】:

      【解决方案3】:

      将指针与堆栈变量一起使用的常见示例:从另一个函数修改局部变量的值。

      #include <stdio.h>
      
      void hoge(int *a) {
          *a = *a + 10;
      }
      
      int main(void) {
          int foo = 5;
          printf("%d\n", foo);
          hoge(&foo);
          printf("%d\n", foo);
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        在函数内部,您可以使用指针算法并引用堆栈上的变量。 变量在函数开始时被压入堆栈,并在结束时弹出。

        在本例中,您可以通过 a 的地址访问 b(请记住压入堆栈的参数顺序 What is argument push order)。

        void fnc(unsigned int a, unsigned int b) {
            unsigned int *pb = (unsigned int *)((long)&a - (long)sizeof(int));
            printf("%d\n", *pb);
        }
        

        【讨论】:

          【解决方案5】:

          另一个例子是交换两个变量值的非常流行和已知的方法。

          #include <stdio.h>
          
          void Swap(char *x,char *y);
          
          int main(void)
          {
              char character1 = 'a';
          
              char character2 = 'z';
          
              Swap(&character1,&character2);
          
              printf("character1 now is : %c\n",character1);
          
              printf("character2 now is : %c\n",character2);
          }
          
          void Swap(char *x,char *y)
          {
              char tmp;
          
              tmp = *x;
          
              *x = *y;
          
              *y = tmp;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-06
            • 2021-12-26
            • 2015-11-16
            相关资源
            最近更新 更多