- 论坛徽章:
- 0
|
曾看到文章说 strcpy 危险指数很高,但是在使用的时候我都做了边界和长度检查的。
有代码 类似于下面:
- int main(xxxxxx)
- {
- int a;
- a = 5;
- struct AA aa; \\ AA 结构含有字符数组成员 struct AA {char str[20]; int b;} :出错
- func(aa, a);
- print("%d\n", a);
- return 0;
- }
- void func(aa, a)
- {
- struct bb;
- ……; \\得到 bb 的具体值;
- strcpy(xxxxxxxxxxxxx); \\ 对结构体中字符数组成员赋值
- …… ;
- \\ 或采用 strncpy; 结果:出错
- \\ 或采用 aa = bb; 直接 赋值, gdb调试时候会提示 memcpy 出错
- }
复制代码
发现代码运行时候经常内存错误,而且变量a的值在func调用后被修改。
采用gdb调试的时候提示strcpy, strncpy 或 memcpy 函数错误。
而改用sprintf对结构体中的字符数组赋值,运行时则没有错误。
可见 aa = bb; 方式对结构体 赋值 C的实现调用了memcpy;而 sprintf 则不调用 memcpy。
但是为什么采用strcpy 、 strncpy 或 aa = bb 的方式 对字符数组赋值会将 a 修改呢?
请各位指点。
[ 本帖最后由 什么名 于 2008-11-5 19:20 编辑 ] |
|