r****o 发帖数: 1950 | 1 【 以下文字转载自 JobHunting 讨论区 】
发信人: roufoo (五经勤向窗前读), 信区: JobHunting
标 题: 请问strcpy()和memcpy()的写法问题
发信站: BBS 未名空间站 (Wed Jun 9 12:54:07 2010, 美东)
我看到的标准strcpy()函数通常都是如下写法:
char *strcpy(char *strDest, const char *strSrc)
{
assert ((strDest!=NULL)&&(strSrc!=NULL));
char *strDest2=strDest;
while ((*strDest2++=*strSrc++)!='\0')
{
}
return strDest;
}
我看到的标准memcpy()函数通常都是如下写法:
void *memcpy(void *ptrDest, const void *ptrSrc, size_t size)
{
assert((ptrDest!=NULL)&&(ptrSrc!=NULL);
voi |
N***m 发帖数: 4460 | 2 ptrsrc fixed?
【在 r****o 的大作中提到】 : 【 以下文字转载自 JobHunting 讨论区 】 : 发信人: roufoo (五经勤向窗前读), 信区: JobHunting : 标 题: 请问strcpy()和memcpy()的写法问题 : 发信站: BBS 未名空间站 (Wed Jun 9 12:54:07 2010, 美东) : 我看到的标准strcpy()函数通常都是如下写法: : char *strcpy(char *strDest, const char *strSrc) : { : assert ((strDest!=NULL)&&(strSrc!=NULL)); : char *strDest2=strDest; :
|
X****r 发帖数: 3557 | 3 你抄错了吧,memcpy里应该是char *而不是void *啊,后者没法++
明显多余的变量编译器都会优化掉的,不用想太多了。
【在 r****o 的大作中提到】 : 【 以下文字转载自 JobHunting 讨论区 】 : 发信人: roufoo (五经勤向窗前读), 信区: JobHunting : 标 题: 请问strcpy()和memcpy()的写法问题 : 发信站: BBS 未名空间站 (Wed Jun 9 12:54:07 2010, 美东) : 我看到的标准strcpy()函数通常都是如下写法: : char *strcpy(char *strDest, const char *strSrc) : { : assert ((strDest!=NULL)&&(strSrc!=NULL)); : char *strDest2=strDest; :
|
T*****9 发帖数: 2484 | 4 glibc里头就是void *的
【在 X****r 的大作中提到】 : 你抄错了吧,memcpy里应该是char *而不是void *啊,后者没法++ : 明显多余的变量编译器都会优化掉的,不用想太多了。
|
X****r 发帖数: 3557 | 5 你说得是哪个版本的glibc?现在的glibc-2.11.2里可是用对齐了的
地址尽可能地大片复制的,加上特定平台的直接用汇编,不是楼主贴的
这么简单的代码。不管怎么说,C里面是不能对void *直接进行指针
运算的。
【在 T*****9 的大作中提到】 : glibc里头就是void *的
|
r****o 发帖数: 1950 | 6 不好意思,我贴的是仅用于面试的版本。
【在 X****r 的大作中提到】 : 你说得是哪个版本的glibc?现在的glibc-2.11.2里可是用对齐了的 : 地址尽可能地大片复制的,加上特定平台的直接用汇编,不是楼主贴的 : 这么简单的代码。不管怎么说,C里面是不能对void *直接进行指针 : 运算的。
|
d****p 发帖数: 685 | 7 I doubt the memcpy implementation is wrong.
Dereferencing a void*?
I think the following is an OK implementation:
void* memcpy(void* dest, const void* src, size_t size)
{
assert(dest != 0 && src != 0);
char* dest2 = (char*)dest;
char* src2 = (char*)src;
while (size-- > 0)
*dest2++ = *src2++;
return dest;
}
Actually the following is also OK:
void* memcpy(void* dest, const void* src, size_t size)
{
assert(dest != 0 && src != 0);
【在 r****o 的大作中提到】 : 【 以下文字转载自 JobHunting 讨论区 】 : 发信人: roufoo (五经勤向窗前读), 信区: JobHunting : 标 题: 请问strcpy()和memcpy()的写法问题 : 发信站: BBS 未名空间站 (Wed Jun 9 12:54:07 2010, 美东) : 我看到的标准strcpy()函数通常都是如下写法: : char *strcpy(char *strDest, const char *strSrc) : { : assert ((strDest!=NULL)&&(strSrc!=NULL)); : char *strDest2=strDest; :
|
d****p 发帖数: 685 | 8 The strcpy doesn't need extra copy because there is no type conversion from
void* to char*
【在 r****o 的大作中提到】 : 不好意思,我贴的是仅用于面试的版本。
|
r****o 发帖数: 1950 | 9 你写的是对的,我写的错了,不好意思。
【在 d****p 的大作中提到】 : I doubt the memcpy implementation is wrong. : Dereferencing a void*? : I think the following is an OK implementation: : void* memcpy(void* dest, const void* src, size_t size) : { : assert(dest != 0 && src != 0); : char* dest2 = (char*)dest; : char* src2 = (char*)src; : while (size-- > 0) : *dest2++ = *src2++;
|