指针与堆中的内存之间的关系

时间:2013-12-22 04:21:33

标签: c memory heap allocation

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

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

所以我想说:

int *a;

所以这样做会创建一个名为a的指针,指向一个整数值。

int *a = address;

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

假设我想要价值,我做我们所谓的解除引用和

int *a = *value;

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

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

2 个答案:

答案 0 :(得分:5)

行。针对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";
   ....
}

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

答案 1 :(得分:2)

  

int * a = * value;

除非value声明为int **

,否则这是不正确的
int **value;

下面是一个使用带有适当注释的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