结构体数组可变,地址连续(转)

若要一个结构体中的数组是可变的,应该这样写

 

struct _example

{

   int size;         //数组的大小

   char* array;    //数组的地址

}example

 

example tmp;

tmp.size = 100;

tmp.array = (char*)malloc(tmp.size);

 

这样结构体里的数组的大小是动态分配的,但是这样分配的地址不是连续的,也就是说array指向的这个数组(不是array的地址)不是接在tmp.size地址的后面,这样有时候会不方便,比如说用memcpy去从tmp首地址开始拷贝,只能拷贝到size和array的值(即数组的首地址),如果想要得到数组里的数据就还要用memcpy从取array的值再来拷贝一次,这样就很麻烦,特别是在socket编程的时候,每次传出的数据都是  大小+数据 的模式,如果是这样写的结构体,就得要调用2次传输函数,但是下面这种写法可以解决这个麻烦。。。

 

struct _example

{

   int size;         //数组的大小

   char array[1];    //数组的地址

}example

 

int nLen = 100+4;

example* tmp = (example*)malloc(nLen);

tmp.size = 100;

 

这样其实是一种取巧的方法,为tmp这个指针分配一个大于example结构体的内存,要多大就看你需要的数组要多大了,这样多余的内存就排在了array后面,array的“规定”大小只有1,但是就算array[1],array[2]array[3]…array[99]它都没有越界或者访问到了非法地址,所以可以放心的往后面添加数据,而这块内存是由一次malloc产生的,所以数据块一定是连续的,这样如果要复制tmp里的内容就可以只用memcpy就可以做好了。

p3p header在单点登录的cookie跨域中的应用

场景一:

A网站全站均为UTF-8编码,B网站全站为GB2312编码。

A网站提供一段JS代码供B网站调用,该代码会动态生成一个FORM表单,以收集提交上来的数据。

B网站此时开始提交数据,但提交上来的中文均为乱码 。

现象的产生是由于二个网站编码不一致而导致的,一般情况下使二个网站的编码一致即可。

如果无法统一编码该怎么办?

FORM有一个accept-charset属性

<form method=”post” action=”…” accept-charset=”utf-8″> 
…  
</form>   

测试成功,但在IE下不成功,需要一个HACK来解决:
在form的onsubmit事件触发时动态改变document的编码,即:

onsubmit=”document.charset=\’utf-8\’;”

场景二:

A网站提供一个页面供其它网站进行Iframe调用,该页面使用了SESSION,并进行了SESSION判断。

现象:

B网站IFRAME了A网站的页面,总显示SESSION过期,但直接在浏览器中打开该页面却又是正常的。

这是由于浏览器的安全性所致,SESSION依赖于COOKIE,A与B是二个完全不同的域,A网站没法去读取B网站下的COOKIE,所以 SESSION也就失效了。

解决办法:

A网站的页面在输出头上附加一个P3P属性,值为CP=CAO PSA OUR即可。
如:

Response.AddHeader(“P3P”, “CP=CAO PSA OUR”);  
if (Session[SESSIONKEY] == null)  
{  
   //TODO:其它操作  
}  

在IE中,页面通过FRAME,JS,IMG等引用其他域名页面的时候,P3P协议会阻止引用也的cookie。

举例说明:

在 B.COM中,

  1. <iframe width = 300 height = 300 src = ”http://www.a.com/test.php” mce_src = ”http://www.a.com/test.php”>

此时,test.php中产生的cookie将会被阻止,而不会记录下来
这种情况下,我们引入P3P header ,情况就改变喽~
P3P header允许跨域访问隐私数据,从而可以跨域set-cookie成功
在 www.a.com/test.php中这样写:

  1. header(\’P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”\’);

cookie就可以跨域了~

这种方法
在单点登陆中被别广泛应用~