青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

static 變量初始化順序引發(fā)的bug

沒想到會(huì)遇到這樣的問題,

在VC6環(huán)境下測(cè)試,重點(diǎn)請(qǐng)看紅色字體與圖片。

 

#include "stdafx.h"

#include <stdio.h>

 

typedef struct sData

{

    static const char* text;

    static int  val_a;

    static int  val_b;

} sData, *Self_Ptr;

 

typedef struct 

{

    char* text;

    int val_a;

    int val_b;

}* Other_Ptr;

 

 

const char* sData::text = "this is a test string\0";

int   sData::val_b = 200;

int   sData::val_a = 100;

 

int main(int argc, char* argv[])

{

    Self_Ptr p_self = (Self_Ptr)&(sData::text);

    Other_Ptr p_other = (Other_Ptr)&(sData::text);

    printf("%d\n", sizeof(sData));                          //----1, static成員不計(jì)入sizeof

    printf("val_a: %d-%d\n", p_self->val_a, sData::val_a);  //----val_a: 100-100

    printf("val_b: %d-%d\n", p_self->val_b, sData::val_b);  //----val_b: 200-200

    printf("val_a: %d-%d\n", p_self->val_a, p_other->val_a);//----val_a: 100-200

    printf("val_b: %d-%d\n", p_self->val_b, p_other->val_b);//----val_b: 200-100

    return 0;

}

 

image

posted on 2008-12-03 21:38 肥仔 閱讀(3464) 評(píng)論(14)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

評(píng)論

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

這都什么啊……
類靜態(tài)成員變量是鏈接進(jìn)代碼段的東西,同一個(gè)類中靜態(tài)成員變量的地址沒有誰向你保證過會(huì)連續(xù)的,三個(gè)變量三個(gè)完全不相干的地址都是完全合理的,你應(yīng)該反思的是從一個(gè)靜態(tài)成員地址反推其他靜態(tài)成員地址這種完全不符合邏輯的做法。
另外,你的p_self->val_a之所以合法是因?yàn)樗吹闹皇莗_self的類型,編譯的時(shí)候發(fā)現(xiàn)是靜態(tài)成員就直接換成實(shí)際地址了。
你可以把
Self_Ptr p_self = (Self_Ptr)&(sData::text);
換成
Self_Ptr p_self = NULL;
結(jié)果是一樣的。
2008-12-03 22:56 | RedNax

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
如果我沒有記錯(cuò)的話
class不是POD,即使是非靜態(tài)成員,也不能保證連續(xù),標(biāo)準(zhǔn)沒有這樣的規(guī)定。
成員為內(nèi)置內(nèi)型或POD類型且同時(shí)沒有成員函數(shù)的struct可以歸為POD了,標(biāo)準(zhǔn)規(guī)定POD內(nèi)存必須連續(xù),有static成員的struct還算不算POD,這個(gè)我倒是不知道。
2008-12-03 23:17 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
right, 你的判斷正確,換成Self_Ptr p_self = NULL; p_self->val_a不會(huì)內(nèi)存訪問違規(guī),說明編譯期已經(jīng)替換了p_self->val_a。
2008-12-03 23:38 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
根據(jù)你的提示,測(cè)試了另一個(gè)種情況,證明內(nèi)存確實(shí)不連續(xù),與定義順序相關(guān) +編譯器相關(guān)。

我找到了一種強(qiáng)制內(nèi)存連續(xù)的辦法,接口轉(zhuǎn)換也OK,但代碼不好看了,如下:


#include "stdafx.h"
#include <stdio.h>

typedef struct
{
struct __Data
{
char* text;
int val_a;
int val_b;
} static data;

} sData, *Self_Ptr;

typedef struct
{
char* text;
int val_a;
int val_b;
}* Other_Ptr;

sData::__Data sData::data
={ "this is a test string\0", 100, 200};

int main(int argc, char* argv[])
{
Self_Ptr p_self = 0;
Other_Ptr p_other = (Other_Ptr)&(sData::data.text);
printf("%d\n", sizeof(sData));
printf("val_a: %d-%d\n", p_self->data.val_a, sData::data.val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, sData::data.val_b);
printf("val_a: %d-%d\n", p_self->data.val_a, p_other->val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, p_other->val_b);
return 0;
}
2008-12-04 00:03 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

還是搞不懂你這樣做是什么意思,要好看這樣就可以了吧:

// #include "stdafx.h"
#include <stdio.h>


typedef struct
{
char* text;
int val_a;
int val_b;
}__Data, *Other_Ptr;

typedef struct sData
{
static __Data data;
} *Self_Ptr;

__Data sData::data
={ "this is a test string\0", 100, 200};

int main(int argc, char* argv[])
{
Self_Ptr p_self = 0;
Other_Ptr p_other = (Other_Ptr)&(sData::data);
printf("%d\n", sizeof(sData));
printf("val_a: %d-%d\n", p_self->data.val_a, sData::data.val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, sData::data.val_b);
printf("val_a: %d-%d\n", p_self->data.val_a, p_other->val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, p_other->val_b);
return 0;
}
2008-12-04 00:52 | RedNax

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
?? 有差別嗎? 代碼不好看,我指p_self->data.val_a,多了一個(gè)data,能夠去掉這個(gè)data就好看了。

因?yàn)轫?xiàng)目中需要提供一個(gè)這樣的能力:有幾百個(gè)全部是static成員的struct,它們只有最后一個(gè)字段是個(gè)POD數(shù)組,長(zhǎng)度會(huì)不同,需要有一個(gè)統(tǒng)一的接口來訪問這些struct的成員,所以做了這個(gè)測(cè)試。

2008-12-04 10:35 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

C++的意愿是希望大家不要太關(guān)注內(nèi)存的布局,各個(gè)編譯器的內(nèi)存布局都是不太一樣的。

標(biāo)準(zhǔn)規(guī)定POD內(nèi)存必須連續(xù)
----------------------
C++標(biāo)準(zhǔn)嗎?98年的時(shí)候和VC6一起出現(xiàn),VC6能支持同一時(shí)期出現(xiàn)的標(biāo)準(zhǔn)?很明顯不能。用VC6的話,就不要把C++標(biāo)準(zhǔn)扯嘴上了。
2008-12-04 11:47 | guest

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@guest
汗,VC6如果對(duì)POD這樣的標(biāo)準(zhǔn)都支持不了,那就太那個(gè)。
VC6一直在用,而且最近1~2年內(nèi)應(yīng)該還是會(huì)作為工作的首選,沒覺得有什么不好。賽揚(yáng)CPU,512MB的內(nèi)存,開4個(gè)VC6 IDE,并行開發(fā)一點(diǎn)都不卡,舒舒服服。
AMD雙核,2G內(nèi)存,打開一個(gè)VS 2008,只聽到硬盤狂叫,10秒以上才能出個(gè)界面,這就是.net的效果?。
上次CSDN看到一個(gè)投票,目前C++集成開發(fā)環(huán)境,10年了的VC6占30%多,依然居第一位。



2008-12-04 12:19 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

關(guān)于靜態(tài)成員的引用,“p_self->val_a”這種寫法雖然語法上沒有問題,但是一般編譯器都會(huì)直接認(rèn)為是“sData::val_a”,所以肯定沒有問題。
而“p_other->val_a”出現(xiàn)了問題,確實(shí)是因?yàn)閮?nèi)存有不連續(xù)的現(xiàn)象。static成員在運(yùn)行時(shí)有可能是放到代碼段里的,其具體規(guī)劃很顯然會(huì)受編譯器和操作系統(tǒng)的影響;而一個(gè)普通的結(jié)構(gòu)題變量實(shí)際上是連續(xù)的放在棧里的。
2008-12-04 13:21 | abettor

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@肥仔
代碼里的問題和static變量初始化順序沒有關(guān)系...
編譯器是編譯器,編輯器是編輯器,雖然微軟把他們綁成一個(gè)VC扔給博主,但博主最好還是把他們分清楚。喜歡VC6編輯器資源消耗小,沒問題,你就一直用VC6的IDE寫代碼;喜歡VC 2008的編譯器支持C++新標(biāo)準(zhǔn),沒問題,你就直接在在命令行用VC 2008的編譯器編譯就行了。不矛盾也不沖突。
2008-12-05 16:47 | helpsoff.com.cn

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@helpsoff.com.cn
呵呵,這不是我們第一次交流了,你這位同志比較喜歡好為人師嘛。但是需要說出點(diǎn)稍微有參考價(jià)值的東西,才可以教育別人,是不是。

交流需要平等,干嘛老擺個(gè)姿態(tài)呢,我覺得不好。
2008-12-05 18:44 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

不知道博主又從那句話看出來本人好為人師了?我說話一直就是這個(gè)樣子,你要是不喜歡,覺得我說的話沒有參考價(jià)值,都是P話,盡管刪了好了,反正這是你的地盤。

說實(shí)話,上篇文章看你做把ASSERT和if綁在一起的傻事,自己把網(wǎng)頁一關(guān)就算了,管我P事。可偏偏又覺得不指出來,看著別人以做傻事為榮看不下去,結(jié)果好了,倒給博主卯上了。對(duì)我提了建議不入耳不說,還扣個(gè)帽子“擺姿態(tài)”。心想算了,多一事不如少一事。今天轉(zhuǎn)博客又轉(zhuǎn)到這里,看到這篇莫名其妙的代碼再加上對(duì)VC的偏見,氣又不打一出來。好吧,寫兩句說說。博主又說沒參考意義,再扣個(gè)帽子“好為人師”。博主,既然你覺得我們是在交流,請(qǐng)拿出你對(duì)我留言的看法來先,技術(shù)層面上的,不要先對(duì)人打上標(biāo)記帶上偏見,好嗎?

回到我上一條留言,我想問問你,你真的弄清楚,裝完VC后,哪塊是編輯器,哪塊是編譯器鏈接器,哪塊是開發(fā)包了嗎?
2008-12-05 19:33 | helpsoff.com.cn

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@helpsoff.com.cn
呵呵,好了。

我必須得承認(rèn),你很強(qiáng),你問的問題讓我不知所措,我非常地茫然,幾乎無地自容。當(dāng)然不會(huì)刪你的留言,只要不是粗痞話,我都不會(huì)刪。大俠的更要留著偶爾看看,好讓自己感到自卑。

這既然是一個(gè)你不屑的地方,就不必再來了吧,何必來看這么膚淺的文章影響了您老人家的心情?

送客了,遠(yuǎn)方的客人請(qǐng)您別再來~~~,:)


2008-12-05 21:00 | 肥仔

# re: static 變量初始化順序引發(fā)的bug[未登錄]  回復(fù)  更多評(píng)論   

。。。。。。。。。。。
路過。。。。。。。。。
。。。。。。。。。。。
2008-12-07 11:22 | cppexplore
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清在线观看| 久久亚洲一区二区三区四区| 国产精品yjizz| 欧美日韩免费区域视频在线观看| 欧美激情乱人伦| 欧美国产亚洲另类动漫| 欧美精品三级| 国产精品毛片在线看| 国产亚洲欧美一级| 在线观看视频欧美| 99精品视频免费| 久久国内精品自在自线400部| 老司机免费视频久久| 亚洲高清在线视频| 一本色道久久综合狠狠躁的推荐| 亚洲欧美日韩综合| 久热re这里精品视频在线6| 欧美精品一区在线播放| 国产欧美亚洲视频| 亚洲肉体裸体xxxx137| 亚洲香蕉网站| 蜜臀久久久99精品久久久久久| 亚洲人成在线观看一区二区| 亚洲欧美一区二区精品久久久| 老司机午夜精品视频在线观看| 欧美视频精品在线观看| 韩日精品视频| 午夜精品久久久久久99热软件| 免费av成人在线| 一区二区三区免费网站| 久久综合九色| 国产亚洲精品久久飘花| 中文av字幕一区| 欧美大片免费观看| 亚洲欧美制服另类日韩| 欧美日韩一区二区三区在线看 | 久久久www成人免费精品| 亚洲精品三级| 久久视频一区| 国产尤物精品| 亚洲伊人伊色伊影伊综合网| 亚洲福利视频一区二区| 久久精品一级爱片| 国产香蕉97碰碰久久人人| 亚洲永久免费av| 亚洲理论在线| 欧美激情精品久久久久久免费印度 | 亚洲第一黄网| 亚洲最快最全在线视频| 久久一区二区三区四区| 国产美女精品免费电影| 亚洲一区二区网站| 91久久久亚洲精品| 久久综合给合久久狠狠色| 国产亚洲午夜| 久久成人综合视频| 亚洲欧美在线一区二区| 欧美性色aⅴ视频一区日韩精品| 亚洲精品久久久久久下一站 | 亚洲免费一级电影| 欧美午夜精品久久久久久孕妇 | 亚洲一区日韩在线| 亚洲乱码久久| 欧美日韩ab| 一区二区日韩| 亚洲最新视频在线播放| 国产精品v亚洲精品v日韩精品| 亚洲一区二区成人| 亚洲无毛电影| 国产视频在线观看一区| 久久精品夜夜夜夜久久| 久久精品成人| 亚洲破处大片| av成人免费在线| 国产精品一区免费视频| 久久精品一区二区三区不卡| 久久精品女人天堂| 亚洲高清精品中出| 亚洲日韩中文字幕在线播放| 国产精品jvid在线观看蜜臀| 欧美在线高清| 欧美电影电视剧在线观看| 亚洲综合欧美日韩| 久久精品夜色噜噜亚洲a∨| 亚洲全黄一级网站| 亚洲综合日韩在线| 亚洲国产日韩欧美在线图片| 亚洲精品综合精品自拍| 国产精品一卡二| 欧美刺激性大交免费视频| 欧美日韩一区二区视频在线观看 | 欧美一区二区三区啪啪| 久久久www成人免费毛片麻豆| 亚洲精品国精品久久99热一| 亚洲午夜日本在线观看| 亚洲国产精品久久久久| 亚洲性色视频| 亚洲青色在线| 欧美一区二区三区四区夜夜大片| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久综合伊人77777蜜臀| 日韩视频永久免费| 午夜久久久久久| aaa亚洲精品一二三区| 欧美一区二区视频97| 一区二区欧美亚洲| 久久久综合免费视频| 亚洲欧美美女| 欧美电影在线免费观看网站| 久久精品一区二区三区不卡牛牛| 在线免费观看视频一区| 日韩视频中文字幕| 黄色日韩在线| 亚洲色在线视频| 亚洲精品欧美极品| 久久精品99国产精品日本| 亚洲专区在线视频| 欧美高清成人| 欧美成人精品福利| 国产视频在线观看一区二区| 日韩视频精品| 亚洲精品在线看| 久久亚洲综合网| 久久久免费av| 国产日韩欧美在线视频观看| 夜夜嗨av色综合久久久综合网| 亚洲国产一区在线观看| 久久久久久久欧美精品| 亚洲一二区在线| 国产美女精品视频免费观看| 女生裸体视频一区二区三区| 国产嫩草影院久久久久| 亚洲乱码久久| 妖精成人www高清在线观看| 免费在线看一区| 欧美激情亚洲另类| 亚洲国产一区二区三区高清 | 国内成+人亚洲+欧美+综合在线| 在线视频精品一区| 亚洲一区二区3| 欧美性猛交xxxx乱大交蜜桃| 日韩午夜av在线| 亚洲主播在线| 国产日韩一区二区| 亚洲欧洲一区二区三区在线观看| 精品福利免费观看| 亚洲欧美日韩专区| 久久国产精品高清| 国际精品欧美精品| 欧美一区二区三区在线观看视频| 久久精选视频| 亚洲黄色av一区| 欧美激情va永久在线播放| 亚洲国产精品久久久久秋霞不卡| 欧美va亚洲va日韩∨a综合色| 亚洲国产精品精华液网站| av成人免费| 国产午夜精品美女视频明星a级| 久久精品国产999大香线蕉| 久热精品视频在线观看| 亚洲六月丁香色婷婷综合久久| 国产精品久久久久久av下载红粉| 欧美一级理论片| 亚洲国产免费看| 性欧美超级视频| 亚洲电影免费观看高清| 欧美日韩美女在线| 欧美在线不卡视频| 亚洲激情一区| 欧美亚洲一区二区在线| 伊人激情综合| 国产精品高潮呻吟| 久久青草久久| 亚洲视频精品| 亚洲福利视频三区| 久久精品人人做人人爽电影蜜月| 91久久亚洲| 国产一区二区剧情av在线| 欧美老女人xx| 久久久青草婷婷精品综合日韩| 亚洲美洲欧洲综合国产一区| 老牛国产精品一区的观看方式| 亚洲一区二区三区777| 亚洲韩国精品一区| 国产亚洲欧美日韩在线一区| 欧美理论电影在线播放| 久久乐国产精品| 亚洲欧美在线视频观看| 亚洲麻豆视频| 欧美成人在线网站| 久久久久久网址| 欧美亚洲系列| 亚洲一区二区三区在线观看视频| 亚洲欧洲日产国产综合网| 国产亚洲日本欧美韩国| 国产精品久久久久久久久 | 欧美日韩亚洲视频| 你懂的成人av| 六月丁香综合| 久久免费视频网站|