我正在尝试使用更安全的strcpy
更新对strcpy_s
的来电。旧函数调用如下所示:
char buf[6];
strcpy(buf+1, "%#c");
为了将上面的代码转换为更安全的版本,我会为size参数添加什么?
char buf[6];
strcpy_s(buf+1, /*SIZE GOES HERE*/, "%#c");
我想我对代码的buf+1
部分感到困惑。这基本上只是一个指针指向来自buf
的寄存器ONE块的指针吗?如果是这样,我会为strcpy_s
的SIZE参数添加什么?我试过了:
strcpy_s(buf+1, sizeof(buf+1), "%#c");
这似乎有效,但我想知道是否有更好的方法来做到这一点。
答案 0 :(得分:5)
如果您要复制buf
的开始,请说:
strcpy_s(buf, sizeof(buf), "%#c");
由于您正在跳过第一个字符,因此您可以使用一个更少的字符,因此:
strcpy_s(buf + 1, sizeof(buf) - 1, "%#c");
答案 1 :(得分:1)
大小应为5
(假设您要跳过第一个索引)。一种正确的计算方法是:
int offset = 1; // not necessary, but shows the connection between the size and offset
strcpy_s(buf+offset, (sizeof(buf)-offset) / sizeof(buf[0]), "%#c");
按字母大小划分是多余的,但要记住这一点很好,因为如果你使用宽字符就必须这样做。
答案 2 :(得分:0)
buf+1
指向一个超出buf
起始地址的内存位置,因此副本从该位置开始有效。但size
参数指定目标的大小。将sizeof(buf+1)
用于该参数没有意义。您应该传递目的地的可用空间(应该是< =(总大小 - 起始偏移量))。
在你的情况下,它应该是
strcpy_s(buf+1, sizeof(buf)/sizeof(*buf) - 1, "%#c");