struct element {
int val;
int z;
};
typedef struct element ELEM;
Run Code Online (Sandbox Code Playgroud)
看看这个例子:
int main()
{
ELEM z;
z = 6;
printf("%d",z);
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但如果我有一个指向结构的指针,我需要编写如下代码:
ELEM *z;
p = (ELEM*)malloc(sizeof(ELEM)); // Without this will not work
(*p).val = 3;
p = (ELEM*)malloc(sizeof(ELEM));
printf("%d",(*p).val);
Run Code Online (Sandbox Code Playgroud)
声明指针不会创建除指针之外的任何内容.必须有一些东西可以指出,这就是malloc给你的东西.
或者,您可以在堆栈上创建结构(也称为"自动存储"):
ELEM z;
ELEM *p = &z;
(*p).val = 3; // Also could be written as p->val = 3;
printf("%d",(*p).val);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你的指针代码有一个错误,因为它泄漏(即丢失了)第一个分配的结构:
ELEM *p;
p = (ELEM*)malloc(sizeof(ELEM));
(*p).val = 3;
p = (ELEM*)malloc(sizeof(ELEM)); // <- leak here: pointer to old struct lost.
printf("%d",(*p).val);
Run Code Online (Sandbox Code Playgroud)
删除第二个malloc修复了问题.一个完整的固定版本,看起来更像您在使用中看到的代码:
ELEM *p = (ELEM*)malloc(sizeof(ELEM));
p->val = 3;
printf("%d\n", p->val);
free(p);
Run Code Online (Sandbox Code Playgroud)
除非你的程序通过终止释放内存,否则每个都malloc应该有free.即便如此,拥有它也很好free.
小智 5
C/C++中指针只是对象的地址,而不是对象本身。在32位系统中,其长度始终为4字节。当您创建指针时,如果您不对其进行初始化或为其分配内存,它将引用无效地址。所以必须通过调用动态创建对象malloc(在C++中可以使用new关键字),然后才能引用到所创建对象的地址。
ELEM elem; //This will create the object at stack.
ELEM* pElem; //This just create an invalid poiter which point to unknown address
pElem = &elem; //This initialize the pointer which point to the address if "elem" above
pElem = (ELEM*)malloc(sizeof(ELEM)); //This create a new memory which contain the object "ELEM" and pElem will point to the address of the object
Run Code Online (Sandbox Code Playgroud)