读书人

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

发布时间: 2012-03-04 11:13:34 作者: rapoo

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)后面的内容)是不确定的;否则如果内存范围超出你自己的程序空间,就会出现访问违规的情况。

读书人网 >C语言

热点推荐