Ral*_*lph 0 c memory heap allocation
我是一名新的C开发人员.我已经用Java编程了3年了.我注意到我必须用C做手动内存分配.
但是,当涉及到指针和内存分配时,我仍然不明确.我会说出我理解的内容,如果有人对我要说的话有任何评论,请指正.
所以我要说:
int *a;
Run Code Online (Sandbox Code Playgroud)
所以这样做会创建一个名为a的指针,指向一个整数值.
int *a = address;
Run Code Online (Sandbox Code Playgroud)
如果我打印地址,我会得到地址.
假设我想要价值,我做我们所谓的解除引用和
int *a = *value;
Run Code Online (Sandbox Code Playgroud)
如果我在这种情况下打印值,我会得到存储在内存中的实际数字.
我注意到在我使用的电子书中,有时候,我们在堆中分配内存.总是这样吗?每次我需要使用一个字符串的指针,例如使用char*,我必须使用alloc()和sizeof()分别根据预期类型的大小分配内存?
好.针对Java人的指针.
当你申报时
int *a;
Run Code Online (Sandbox Code Playgroud)
它与Java中的相同:
Integer a;
Run Code Online (Sandbox Code Playgroud)
Java没有指针,但所有对象都由引用保存.所以,
Integer a = new Integer(3);
Run Code Online (Sandbox Code Playgroud)
是相同的:
int *a = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
在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
}
Run Code Online (Sandbox Code Playgroud)
如果你确实使用malloc,那么是的,你必须指定你想要多少空间.但您可以轻松地要求编译器在静态数据空间中分配空间:
void f() {
char *p = "hello";
....
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,文字字符串通常成为编译程序的一部分,并在OS程序启动时放置在静态分配的位置.