[英]String in struct. corrupted
有像這樣的結構。
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
和設置地址的功能。
void Database_set(struct Connection *conn, int id, const char *name, const char *email) {
struct Address *addr = &conn->db->rows[id];
if(addr->set) die("Address already set");
addr->set = 1;
char *res = strncpy(addr->name, name, MAX_DATA);
if(!res) die("Name copy failed");
*res = strncpy(addr->email, email, MAX_DATA);
if(!res) die("Email copy failed");
}
但是addr-> name的第一個字符在此行之后被破壞了。
*res = strncpy(addr->email, email, MAX_DATA);
有任何想法嗎?
strncpy
返回它的第一個參數
char *res = strncpy(addr->name, name, MAX_DATA);
變量res
保存addr->name
(等效地, &(addr->name[0])
)所以當
*res = strncpy(addr->email, email, MAX_DATA);
運行它相當於
addr->name[0] = strncpy(addr->email, email, MAX_DATA);
這個賦值是破壞addr->name
的第一個char。 正如Greg Hewgill所說,你不需要檢查甚至保存strncpy
的返回值。
我認為strncpy()
函數不是你想要的。 考慮一下電話:
strncpy(addr->name, name, MAX_DATA);
如果name
具有MAX_DATA
或更多字符,則會將name
的字節復制到addr->name
並且不會 NUL終止目標。 您有兩個一般選擇:
手動NUL使用諸如的代碼終止結果
addr->name[MAX_DATA-1] = '\\0';
但是,這很容易出錯,因為每次都必須記住這樣做。
使用庫函數,例如strlcpy()
(通常在BSD派生的系統上可用,但不是標准的),總是NUL終止目標,即使源不完全適合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.