[問題] dynamic 2d array

看板C_and_CPP (C/C++)作者 (傻傻)時間16年前 (2009/11/12 12:11), 編輯推噓5(5020)
留言25則, 5人參與, 最新討論串1/1
請教各位大大幾個觀念~ #include"string.h" #include<iostream.h> #pragma argsused using namespace std; int main(int argc, char* argv[]) { char a[10],**pt,*ptr; ptr=new char[10]; cout<<sizeof(*ptr)<<endl; //sizeof內要填什麼才有辦法確認我的空間大小是char[10]? pt=new char*[3]; for(int i=0;i<3;i++) pt[i]=new char[5]; for(int i=0;i<3;i++) cout<<"add:"<<(void*)pt[i]<<endl; //先show 每個array address for(int i=0;i<3;i++) strcpy(*(pt+i),"abc"); //預設pt[0~2]="abc" cout<<endl<<endl; for(int i=0;i<3;i++) delete[] pt[i]; for(int i=0;i<3;i++) cout<<(void*)pt[i]<<":"<<*(pt+i)<<endl; //砍掉空間後重新顯示內容 for(int i=0;i<3;i++) strcpy(*(pt+i),"123"); //刪除空間後又重新寫入123 for(int i=0;i<3;i++) cout<<(void*)pt[i]<<":"<<*(pt+i)<<endl; delete[] pt; //出現錯誤 system("pause"); return 0; } 結果: 1 add:14378936 add:14378952 add:14378968 14378936:abc 14378952:abc 14378968:abc 14378936:*%&(亂碼) 14378952:abc 14378968:abc 14378936:123 14378952:123 14378968:123 問題1:cout<<sizeof(*ptr)<<endl; sizeof內要填什麼才有辦法確認我的空間大小是char[10]?或者沒辦法這樣使用 問題2:根據爬文結果 for(int i=0;i<3;i++) delete[] pt[i]; 砍掉空間後依然可以show值(14378952:abc) 只是new的空間被砍而已 但我後面又做了寫入123的動作為什麼還可以正常秀出結果? 反而是在delete[] pt;這一行出現error -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.210.112.66

11/12 12:23, , 1F
1. 一般指標接到new/malloc出來的空間沒辦法用sizeof取
11/12 12:23, 1F

11/12 12:24, , 2F
大小; 對該指標sizeof出來的是指標本身的大小, 而不
11/12 12:24, 2F

11/12 12:25, , 3F
是指到空間的大小; sizeof的算法只能用於固定配置的.
11/12 12:25, 3F

11/12 12:25, , 4F
2. new是跟OS要一塊記憶體來用, delete是跟OS說那塊你不
11/12 12:25, 4F

11/12 12:26, , 5F
用了; delete掉還去存取該空間偶爾仍能得到正確的結
11/12 12:26, 5F

11/12 12:26, , 6F
果是因為它還沒被其他地方佔用, 事實上這樣的作法是
11/12 12:26, 6F

11/12 12:27, , 7F
危險而且錯誤的; delete兩次會錯是因為OS發現你嘗試
11/12 12:27, 7F

11/12 12:27, , 8F
歸還一個根本不屬於你的記憶體空間.
11/12 12:27, 8F

11/12 12:29, , 9F
3. 最後, 胡搞記憶體之後, 會發生什麼事情根本沒辦法保
11/12 12:29, 9F

11/12 12:29, , 10F
證, 個人覺得沒必要去研究一個錯誤行為產生的不確定
11/12 12:29, 10F

11/12 12:30, , 11F
結果....@_@"
11/12 12:30, 11F

11/12 13:45, , 12F
strlen(ptr)
11/12 13:45, 12F

11/12 13:53, , 13F
strlen恐怕不是這樣用的...XD
11/12 13:53, 13F

11/12 14:02, , 14F
sorry, 查了一下strlen是用在c string..
11/12 14:02, 14F

11/12 14:02, , 15F
原文中有個很大的錯誤 delete[] pt[i];
11/12 14:02, 15F

11/12 14:04, , 16F
delete pt[i];
11/12 14:04, 16F

11/12 14:05, , 17F
應改為這樣
11/12 14:05, 17F

11/12 14:07, , 18F
delete [] pt[i]沒錯吧@@ pt[i]=new了一塊[]不是嘛
11/12 14:07, 18F

11/12 14:07, , 19F
原po那樣寫才是對的, delete []x; 用在x是要了一個array
11/12 14:07, 19F

11/12 14:08, , 20F
回來而不是單個instance.
11/12 14:08, 20F

11/12 14:09, , 21F
另外, strlen只能找到char指標開始到遇到'\0'的長度....
11/12 14:09, 21F

11/12 14:09, , 22F
不是來算可用空間/array element數; 而且不是char型態一
11/12 14:09, 22F

11/12 14:09, , 23F
樣沒有用....
11/12 14:09, 23F

11/12 14:11, , 24F
恩...又看錯 0rz
11/12 14:11, 24F

11/12 15:23, , 25F
感謝大家! 我懂了
11/12 15:23, 25F
文章代碼(AID): #1A-uhlzE (C_and_CPP)
文章代碼(AID): #1A-uhlzE (C_and_CPP)