考虑以下计划:
#include <stdio.h>
#include <stdlib.h>
int main()
{
typedef struct WFC_STRUCT {
int a;
int b;
} WFC_STRUCT;
WFC_STRUCT *ptr = (WFC_STRUCT*) NULL;
ptr->a=10;
return(0);
}
我想了解教学中发生的事情:
WFC_STRUCT *ptr = (WFC_STRUCT*) NULL;
为什么程序会破坏?在什么情况下使用上面的说明?。
答案 0 :(得分:6)
虽然在这一行演员
WFC_STRUCT *ptr = (WFC_STRUCT*) NULL;
没用,实际问题出在下一行:
ptr->a=10; /* This is equivalent to: (*ptr).a=10; */
其中,您取消引用NULL指针。它是undefined behaviour。基本上,ptr
应该指向有效/可写的内存位置。但是在你的代码中,它不是。
答案 1 :(得分:2)
WFC_STRUCT *ptr = (WFC_STRUCT*) NULL; // cast is unnessesary
//moreover you have no memory alloacted
WFC_STRUCT *ptr = malloc(sizeof *ptr); // allocates memory, if this is done
//then you can do below
ptr->a=10;
请检查[ this ]如何使用指针的答案
答案 2 :(得分:1)
pointer
是一个变量,它保存存储在计算机内存中的变量的位置,字面意思是地址。取消引用指针意味着将存储在存储器中的值存储在指针“指向”的地址处。
因此,要使用指向该结构的指针访问结构单个成员,指针变量应指向一个有效的内存地址,在该地址处将内存分配给结构变量。
但是程序中ptr
指向结构WFC_STRUCT
的指针并没有指向有效内存地址空间中类型为WFC_STRUCT
的有效结构变量。因此,使用ptr
访问结构变量没有意义。
此外,WFC_STRUCT *ptr = (WFC_STRUCT*) NULL
演员阵容无关紧要。
如果要使用指针访问结构变量,可以通过两种方式执行此操作:
WFC_STRUCT *ptr = malloc(sizeof(WFC_STRUCT));
OR
WFC_STRUCT *ptr;
WFC_STRUCT var;
ptr = &var;
ptr->a = 20;
Remenber,如果使用malloc
函数调用分配一些内存空间,则需要调用free
函数在不再需要时释放内存空间。但是,在第二种方法中,当变量在堆栈上创建时,所有automatic
变量将在函数返回时被销毁。
答案 3 :(得分:0)
WFC_STRUCT *ptr = (WFC_STRUCT*) NULL;
只是将地址0(值为NULL
)分配给ptr
。通常的做法是将NULL
分配给新创建的指针。
现在,在大多数操作系统上都不允许使用指向0th
地址的指针访问值,因此程序正在破坏。
如果您确实要为ptr->a
分配值,则ptr
应指向正确的内存位置。
WFC_STRUCT *ptr = (WFC_STRUCT*) malloc(sizeof(WFC_STRUCT));
ptr->a = 10;
free(ptr); // remember to free the allocated memory
ptr = NULL;