網域名稱俱樂部


返回   網域名稱俱樂部 > 電腦與網路技術 > 電腦網路相關技術 > 一般軟體與網路使用討論

回覆
 
主題工具
  #1  
舊 2015-08-27, 06:39 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 22,990
預設 C++ 請教

下面這程式,請問紅字的部份?謝謝。

#include <iostream>
using namespace std;

class strtype {
char *p;
int len;
public:
strtype(char* ptr);
~strtype();
void show();
};

strtype::strtype(char *ptr){

len=strlen(ptr);
p=(char*)malloc(sizeof(len+1));//為何這裡要加一?不用加一也可以啊?
if(!p) {
cout<<"Allocation error.\n";
exit(1);
}

strcpy(p,ptr);
}
strtype::~strtype(){
free(p);
}

void strtype::show(){
cout<< "The length of "<< p <<" is "<<len<<endl;
}

int main(){

strtype s1("Hello world!"),s2("This is a book.");

s1.show();
s2.show();

return 0;
}
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #2  
舊 2015-08-28, 10:17 AM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

用strlen的時候要多一個來記錄\0,因為strlen遇到\0就停止,但實際上要存
字串的時候最後的terminator是要存的 #len=strlen(ptr);
這裡會這樣寫的原因是 sizeof(char) 嚴格定義為1,所以寫成 sizeof(len+1)
回覆時引用此篇文章
  #3  
舊 2015-08-28, 12:10 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 22,990
預設

引用:
作者: a40136 查看文章
用strlen的時候要多一個來記錄\0,因為strlen遇到\0就停止,但實際上要存
字串的時候最後的terminator是要存的 #len=strlen(ptr);
這裡會這樣寫的原因是 sizeof(char) 嚴格定義為1,所以寫成 sizeof(len+1)
喔 ,原來如此。

只是我如果沒有+1似乎執行結果也沒有差別?

而且如果我用p=(char!)malloc(sizeof(ptr))而非sizeof(len)的話,不知道有沒有把最後一個'\0'的空間也包進來?
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #4  
舊 2015-08-30, 11:03 PM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

沒加1會導致後方連續記憶體被覆蓋,這會造成一些問題。
不會,因為你真對ptr去取,他是回傳pointer大小,不論型態4byte
回覆時引用此篇文章
  #5  
舊 2015-08-30, 11:36 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 22,990
預設

引用:
作者: a40136 查看文章
沒加1會導致後方連續記憶體被覆蓋,這會造成一些問題。
不會,因為你真對ptr去取,他是回傳pointer大小,不論型態4byte
十分感謝。

__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
回覆

主題工具

發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼



所有時間均為 +8。現在的時間是 04:41 PM


本站主機由網易虛擬主機代管
Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.