struct中的字符串.损坏

Tig*_*yan 2 c struct

有像这样的结构.

struct Address {
    int id;
    int set;
    char name[MAX_DATA];
    char email[MAX_DATA];
};
Run Code Online (Sandbox Code Playgroud)

和设置地址的功能.

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");
}
Run Code Online (Sandbox Code Playgroud)

但是addr-> name的第一个字符在此行之后被破坏了.

*res = strncpy(addr->email, email, MAX_DATA);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Geo*_*edy 6

strncpy 之后返回它的第一个参数

char *res = strncpy(addr->name, name, MAX_DATA);
Run Code Online (Sandbox Code Playgroud)

变量res保持addr->name(等价&(addr->name[0])),所以当

*res = strncpy(addr->email, email, MAX_DATA);
Run Code Online (Sandbox Code Playgroud)

运行它相当于

addr->name[0] = strncpy(addr->email, email, MAX_DATA);
Run Code Online (Sandbox Code Playgroud)

这个任务破坏了第一个字符addr->name.正如Greg Hewgill所说,你不需要检查甚至保存返回值strncpy.