Re: [問題] 關於引用副程式與memory的問題

看板C_and_CPP作者 (千の風になって)時間12年前 (2013/06/26 00:13), 編輯推噓3(304)
留言7則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《Is5566 (5566Is)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC : 問題(Question): : 最近遇到一些C++面試時的問題,但自己仍找不出問題的地方 : 想請教前輩們下面問題的解答,謝謝 : 1.下面的程式,紅色是自己覺得有問題修改的地方,但不知道是否還有錯誤? : #define PI 3.14 : doule AREA_CAL_IRQHANDLER(double radius) : { : double area = PI*radius*radius; : printf(“\nArea=%f”, area); : return area; (此行應該改return 0;) 應該是不用改....就讓他回傳面積吧 : } : 2.想請問下面function在做什麼動作跟如果有問題的話會發生在哪? : int main () : { : int i,n; : char * buffer; : printf ("How long do you want the string? "); : scanf ("%d", &i); : buffer = (char*) malloc (i+1); : if (buffer==NULL) exit (1); : (如果在這exit,上面叫的memory不會被free?) : : if(i>1000) return 1; 你都這麼講了就把這行移到malloc之前吧 : for (n=0; n<i; n++) : buffer[n]=rand()%26+'a'; : buffer[i]='\0'; : printf ("Random string: %s\n",buffer); : free (buffer); : return 0; : } : 3.想請問該行會在哪裡出問題? : struct S { : int i; : int *p; : }; : main() (少加上int main()?) : { : S s; : int *p = &s.i; : p[0] = 4; : p[1] = 3; p[1] 位置為指標,強迫塞入內存位置3似乎沒甚麼意義 : s.p = p; (這裡指的p值似乎有問題?) 這邊s.p位址指到s.i,應該是沒問題 : s.p[1] = 1; 又塞了內存位置1給s.p : s.p[0] = 2; 塞值到內存位置1, 這樣不行喔, OS會生氣 : } 引言太多...只好多偷點p幣 ╮(╯◇╰)╭ ╮(╯◇╰)╭ ╮(╯◇╰)╭ ╮(╯◇╰)╭ ╮(╯◇╰)╭ -- 我來當p幣小偷的... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.231.12 ※ 編輯: olozil 來自: 114.34.231.12 (06/26 00:14) ※ 編輯: olozil 來自: 114.34.231.12 (06/26 00:14)

06/26 05:20, , 1F
p[1] = 3;不只沒意義,可能會當掉吧。
06/26 05:20, 1F

06/27 00:21, , 2F
只塞值應該不會有事吧 就像你assign NULL一樣
06/27 00:21, 2F

06/27 00:44, , 3F
塞值不會當掉的,但你用那個讀取就不一定
06/27 00:44, 3F

06/27 00:57, , 4F
p[1]那塊記憶體不合法,R/W應該都會當吧?
06/27 00:57, 4F

06/27 01:29, , 5F
有可能不會當, 但是是 undefined behavior 應該沒錯
06/27 01:29, 5F

06/27 01:30, , 6F
如果 S::i 跟 S::p 中間沒有 padding 那可能不會當
06/27 01:30, 6F

06/27 01:49, , 7F
又是 undefined behavior ...到底有多少啊Orz
06/27 01:49, 7F
文章代碼(AID): #1HoS6QGZ (C_and_CPP)
文章代碼(AID): #1HoS6QGZ (C_and_CPP)