c语言强制类型转换相关内容

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c语言强制类型转换

首先定义一个结构体:

struct Node{

int num1;

int num2;

}

一、如果在函数中申明了一个指向结构体的指针:一下为两种情况

1)Node * node1; 这时候在这个指针指向的地方已经申请了struct node大小的空间,但是其中的num1 和num2的值是一个不确定的随机值。

2)Node * node1 = NULL; 在这种情况下这个指针没有指向任何地方,也没有申请任何空间,所以num1和num2是不存在的。如果要显示node1的值,有些编译器在这

种情况下是报错的,gcc不会报错,但是在显示的时候会显示段错误

二、下面说一下在子函数调用的时候的结构体指针的类型转换

main()

{

unsigned long add;

fun ((struct Node *)addr);

}

void fun(struct Node *node2)

{

}

其中addr是已经在一个地址,只不过是以unsigned long的形式存在

情况一、如果addr这个地址指向的是一个已经被数据填充的区域,在这种调用关系中就会产生段错误,可能会覆盖已有的数据。一般运行过程中会发生内存错误而中断程序的执行。

情况二、如果addr 这个地址指向的是一个没有被数据填充的区域,在这种情况下,调用子函数会建立相应的struct Node数据结构,这个数据结构式在当前地址下开始建立的。这种情况用于嵌入式体统中,程序员对内存的区域非常熟悉,知道下一个地址肯定是未被使用的区域,否则后果不堪设想。

常规做法是在main函数中申请struct node空间,然后把地址传递给子函数进行操作,这样操作的结果是会被返回到主函数中,这是非常安全的做法。而申请这样的空间可以用动态内存分配的方法。上述情况一二之所以会出错或者非常危险,是因为它不符合内存动态非配的原理,没有动态申请内存,而把当前已有的空间(非struct node类型的空间)强制转换为了struct node 类型的空间进行了使用,这当然是危险的,也是不允许的。上述的两种情况只有在pc机重启或者嵌入式系统设计的时候会出现。

相关文档
最新文档