为什么调用memcpy函数会出现段错误
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[100] = "http://172.16.1.144/api/device/device/deviceAssemblyStatus";
char* p;
char* p1;
char* iface;
p = (char*)str;
p += strlen("http://");
printf("p = %s\n",p);
p1 = strchr(p,'/');
printf("p1 = %s\n",p1);
int len = 0;
len = strlen(p) - strlen(p1);
printf("p len - p1 len = %d\n",len);
printf("p1+1 = %s\n",p1+ 1);
if(*(p1+1)){
printf("p1 len =%d\n",strlen(p1));
memcpy(iface, p1+1, 38);
iface[strlen(p1)-1] = '\0';
printf("iface = %s\n",iface);
}
return 0;
}
要先给iface分配空间,否则你往野指针里写数据肯定不让写呀
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[100] = "http://172.16.1.144/api/device/device/deviceAssemblyStatus";
char* p;
char* p1;
char iface[100] = {0}; //给字符串分配空间
p = (char*)str;
p += strlen("http://");
printf("p = %s\n",p);
p1 = strchr(p,'/');
printf("p1 = %s\n",p1);
int len = 0;
len = strlen(p) - strlen(p1);
printf("p len - p1 len = %d\n",len);
printf("p1+1 = %s\n",p1+ 1);
if(*(p1+1)){
printf("p1 len =%d\n",strlen(p1));
memcpy(iface, p1+1, 38);
iface[strlen(p1)-1] = '\0';
printf("iface = %s\n",iface);
}
return 0;
}
内存拷贝
void * memcpy ( void * destination,const void * source,size t num ) ;
功能:函数从source中复制num个字节到destination中,并返回destination指针。 如果destination 和source 重叠,则函数行为不确定
因为参数的类型都是void*,所以传任何类型的数据都可以,传多少由第三个参数字节数来决定
void* my_memcpy(void* dest,const void* src, size_t num)
{
assert(src && dest); //断言
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src; /*因为num是字节个数,并且也不知传进来的是什么数据类型,所以把指针强转为char*类型,一 个字节一个字节传*/
dest = (char*)dest + 1; //void* 类型的指针不能++
src = (char*)src + 1;
}
return ret;
}
memcpy函数应该拷贝不重叠的内存,拷贝重叠内存的情况应该交给memmove函数,而memcpy函数只要实现了不重叠拷贝就可以了,而VS中的实现既可以拷贝不重叠,也可以拷贝重叠内存,也就是说VS中的memcpy函数是按照memmove函数来实现的,但不保证其他编译器是这种情况,即
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
my_memcpy(arr+2,arr1,20); /*有内存重叠的情况,本意是想将1,2,3,4,5拷贝到3,4,5,6,7的空间内的,实际拷贝情况为 1,2,1,2,1,2,1,8,9,10*/
return 0;
}
程序运行的大致过程如下图:
在第2次while循环后,src指向了下标为2的位置,这里存放了前面复制过来的1,dest指向了下标为4的位置,这里的元素是5,所以在进行第3次while循环时,将1复制到了5的位置,便又出现了元素1,后面步骤同理,所以用memcpy对内存重叠的操作不太友好