使用Struct和指针的程序中的不确定性(C语言程序)

时间:2016-07-27 11:48:16

标签: c pointers struct

考虑以下计划:

#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;

为什么程序会破坏?在什么情况下使用上面的说明?。

4 个答案:

答案 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;