[問題] VC++ 記憶體問題 求教

作者: ostrichw (無聊)   2016-03-03 18:04:03
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 2008
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
出自The C Puzzle Book 裡面的範例
#include "stdio.h"
struct S1{
char *s;
int i;
struct S1 *s1p;
};
int _tmain(int argc, _TCHAR* argv[])
{
static struct S1 a[] = {
{ "abcd", 1, a+1},
{ "efgh", 2, a+2},
{ "ijkl", 3, a}
};
struct S1 *p = a;
int i;
for( i=0; i<2; i++)
{
printf("++a[i].s[3]= %c", ++a[i].s[3]);
}
return 0;
}
這是我們公司同事問的問題
我把這段程式碼放進VC++專案
編譯的時候沒有問題
但是執行結果卻會出現
於 0x000d141b 的 S2.exe 中發生未處理的例外狀況: 0xC0000005:
寫入位置 0x000d574f 時發生存取違規
問題出在 printf("++a[i].s[3]= %c", ++a[i].s[3]);
因為這是從書本上照打的
我也比對幾個版本所以先排除書本出錯的的可能性
不知道有哪位大大可以解釋一下出錯的原因?
如果有相關資料讓我能夠深入閱讀會更加感謝
小弟我是做數學演算法的開發
對於資工的軟硬體架構並不是非常了解
還請各位大大見諒
作者: Caesar08 (Caesar)   2016-03-03 18:09:00
[重要] 發文前務必閱讀:常見問題十三誡 第四點
作者: ostrichw (無聊)   2016-03-03 18:11:00
那為何書上會是這樣寫,是舊版編譯器不會檢查還是C語言編譯器不檢查?
作者: LPH66 (-6.2598534e+18f)   2016-03-03 20:52:00
是以前的編譯器沒把它放在唯讀的地方而已這個存取違規即是去更改了字串常數的內容

Links booklink

Contact Us: admin [ a t ] ucptt.com