首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言中类型强制转换引起段异常有关问题!紧急

2012-03-04 
C语言中类型强制转换引起段错误问题!!!紧急求救~~~~~~~~~~~~~~如下代码:typedefstructSS_t{charcolumn[256

C语言中类型强制转换引起段错误问题!!!紧急求救~~~~~~~~~~~~~~
如下代码:

typedef   struct   SS_t{
char   column[256];
}   SS;


void   f(void*   p){
    SS   s;
    s   =   *((SS*)p);                           //这里取值时候越界
    printf( "%d\n ",s);
}

void   main(){

    int   a   =   10;
    int   *p   =   &a;
    f(p);

}
错误很难出现~~
注释的位置取值时候越界,这点我知道,但我只是读取了内存,并不对他进行写操作。
这个和   int   --   char   类型之间的强制转换有什么不一样吗?同样是不同长度的两个类型之间的强制转化,请高手们解惑~~~

[解决办法]
int和char之间的转换是重新生成一个,被转换的不变。
char a = 'A ';
int b = (int)a;
b = 10//a不变
你这里对p的转换是没有问题的,但读取的时候就不对了,你把int当作SS来读取,而不是将int转换成SS。
读取越界的数据是可能引发访问违规的,会出错。
[解决办法]
我在linux下面没有出现段错误的问题 打印出来的结果为10
[解决办法]
int 2字节
char 1字节
SS 256字节
[解决办法]
楼主是什么环境,我在VS2005下面编译通过,并且运行正确,分析一下你的代码也并没有发现什么错误.楼主只是强制把一段内存分配给s,s里的256个字符刚好等于&a地址后的连续内存,在VS2005下打开内存可以看到,s赋值以后的内容和&a地址的内容完全一致,结果也打印出10了. 所以我的结论:没有错误
[解决办法]
个人观点~

这里面并不存在 int 和 SS 的类型转换
参数传递时进行 int * 到 void * 的转换,而 void * 指向的内容是没有大小的,所以在函数里 将 void * 转换为 SS * 的时候。s = *(SS *)p 仅仅是说明了s 现在指向的内容大小为sizeof(SS), 如果该内存范围属于你自己的程序空间,访问时不会出现错误,只是(s + sizeof(int)后面的内容)是不确定的;否则如果内存范围超出你自己的程序空间,就会出现访问违规的情况。

热点排行