memcpy
預計,第二個參數指向一個地方存儲從你想採取的數據。 '\0'
不指向內存:當它轉換爲void*
時,它變成NULL
。解除引用NULL
會導致未定義的行爲,從而導致您看到的執行時錯誤。
如果你想設置零到一個特定的領域,用memset
代替memcpy
:
memset(this->model, 0, sizeof(this->model)); // this->model is an array
然而,填補了陣列零是在您的情況不必要的:如果你正確地複製字符串,你止跌不必填寫零來獲得終結者。這裏的問題是 - 當你做到這一點,
strncpy(this->model, model, strlen(model));
空終止是不寫入this->model
陣列,留下串終結處理。您的代碼用於通過用零填充陣列來「彌補」這個缺點。但是,當strlen(model)
與您可以寫入this->model
數組的字符總數相同時,這會使字符串未終止。
要解決這個問題,我會用strlcpy
如果你的系統提供了它(注意 - 它不是C標準的一部分)。
strlcpy(this->model, model, sizeof(this->model));
如果您的系統沒有它,你可以按如下模擬其效果:
int len = min(sizeof(this->model)-1, strlen(model));
memcpy(this->model, model, len);
this->model[len] = '\0';
編輯:感謝大家誰對這個評論!
敢肯定你的意思'memset',不'memcpy'。我可以想出幾種比這裏採取的方法更好的方法,特別是因爲後者不僅不安全,而且因爲目標緩衝區大小完全避免,顯然是*有目的*。 – WhozCraig
注意,如果'strlen(model)> sizeof this-> model',這會導致緩衝區溢出,並且在相等情況下它不會生成以null結尾的字符串。 –
'this-> model'是一個數組,對吧? – dasblinkenlight