有像这样的结构.
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)
有任何想法吗?
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
.