【问题标题】:Relation between pointers and the memory in the heap指针与堆中内存的关系
【发布时间】:2014-01-10 15:36:46
【问题描述】:

我是一名新的 C 开发人员。我已经用 Java 编程 3 年了。 我注意到我必须在 C 中进行手动内存分配。

但是,当涉及到指针和内存分配时,我仍然模棱两可。 我会说我理解的,如果有人对我要说的话有任何意见,请纠正我。

假设我有:

int *a;

所以它的作用是创建一个名为 a 的指针,它指向一个整数值。

int *a = address;

如果我打印地址,我会得到地址。

假设我想要这个值,我做我们所说的取消引用和

int *a = *value;

如果我在这种情况下打印值,我会得到存储在内存中的实际数字。

我在我正在使用的电子书中注意到,有时我们在堆中分配内存。 总是这样吗?每次我需要对字符串使用指针时,例如使用 char*,我必须使用 alloc() 和 sizeof() 根据预期类型的​​大小分别分配内存?

【问题讨论】:

  • 指针并不总是在堆中,如果这就是你要问的。 int b; a = &b;a 设置为指向b,而b 通常位于系统堆栈上。如果你尝试reallocfree 它,通常会引起欢闹。
  • “欢闹常常接踵而至”——爱它! :)

标签: c memory heap-memory allocation


【解决方案1】:

int *a = *value;

除非value 被声明为int **,否则这是不正确的:

int **value;

下面是使用带有适当 cmets 的 int 指针的序列:

int num1;          // Declare an int
int num2;          // Declare a different int
int *pNum = &num1; // Declare an int pointer and set its value to the address of num1
*pNum = 6;         // Set the value of num1
pNum = &num2;      // Change value of int pointer to the address of num2
*pNum = 10;        // Set the value of num2

【讨论】:

    【解决方案2】:

    好的。给 Java 人的指针。

    当你声明时

    int *a;
    

    这和Java中的做法是一样的:

    Integer a;
    

    Java 没有指针,但所有对象都由引用保存。所以,

    Integer a = new Integer(3);
    

    等同于:

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

    在 C 中。

    现在,Java 没有 & 运算符,您不能进行指针运算,但引用实际上大致相同。

    回答您的问题:

    • 它总是必须来自堆吗?

    没有。在 C 语言中,您可以将指针指向已在堆栈上分配的内容(或 RAM 中的任何其他位置,例如用于进行硬件交互的 DMA 寄存器):

    void f() {
       int i;
       int *a = &i;
       *a = 3; // same as i = 3
    
       a = (int*)0x12340000; // some address in memory, possibly screen RAM?
       *a = 0xffffffff; // possibly set some colors on the screen
    }
    
    • 是否每次都必须使用 malloc 和 sizeof 来分配空间?

    如果你确实使用了 malloc,那么是的,你必须指定你想要多少空间。但是您可以很容易地要求编译器在静态数据空间中分配空间:

    void f() {
       char *p = "hello";
       ....
    }
    

    在这种情况下,文字字符串通常会成为编译程序的一部分,并在操作系统启动程序时放置在静态分配的位置。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2019-07-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多