簡體   English   中英

struct中的字符串。 損壞

[英]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終止目標。 您有兩個一般選擇:

  1. 手動NUL使用諸如的代碼終止結果

     addr->name[MAX_DATA-1] = '\\0'; 

    但是,這很容易出錯,因為每次都必須記住這樣做。

  2. 使用庫函數,例如strlcpy() (通常在BSD派生的系統上可用,但不是標准的),總是NUL終止目標,即使源不完全適合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM