看板 C_and_CPP 關於我們 聯絡資訊
請教各位大大幾個觀念~ #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
VictorTom:1. 一般指標接到new/malloc出來的空間沒辦法用sizeof取 11/12 12:23
VictorTom: 大小; 對該指標sizeof出來的是指標本身的大小, 而不 11/12 12:24
VictorTom: 是指到空間的大小; sizeof的算法只能用於固定配置的. 11/12 12:25
VictorTom:2. new是跟OS要一塊記憶體來用, delete是跟OS說那塊你不 11/12 12:25
VictorTom: 用了; delete掉還去存取該空間偶爾仍能得到正確的結 11/12 12:26
VictorTom: 果是因為它還沒被其他地方佔用, 事實上這樣的作法是 11/12 12:26
VictorTom: 危險而且錯誤的; delete兩次會錯是因為OS發現你嘗試 11/12 12:27
VictorTom: 歸還一個根本不屬於你的記憶體空間. 11/12 12:27
VictorTom:3. 最後, 胡搞記憶體之後, 會發生什麼事情根本沒辦法保 11/12 12:29
VictorTom: 證, 個人覺得沒必要去研究一個錯誤行為產生的不確定 11/12 12:29
VictorTom: 結果....@_@" 11/12 12:30
walm20: strlen(ptr) 11/12 13:45
james732:strlen恐怕不是這樣用的...XD 11/12 13:53
walm20:sorry, 查了一下strlen是用在c string.. 11/12 14:02
walm20:原文中有個很大的錯誤 delete[] pt[i]; 11/12 14:02
walm20:delete pt[i]; 11/12 14:04
walm20:應改為這樣 11/12 14:05
QQ29:delete [] pt[i]沒錯吧@@ pt[i]=new了一塊[]不是嘛 11/12 14:07
VictorTom:原po那樣寫才是對的, delete []x; 用在x是要了一個array 11/12 14:07
VictorTom:回來而不是單個instance. 11/12 14:08
VictorTom:另外, strlen只能找到char指標開始到遇到'\0'的長度.... 11/12 14:09
VictorTom:不是來算可用空間/array element數; 而且不是char型態一 11/12 14:09
VictorTom:樣沒有用.... 11/12 14:09
walm20:恩...又看錯 0rz 11/12 14:11
kyokb:感謝大家! 我懂了 11/12 15:23