为什么调用memcpy函数会出现段错误#include <stdio.h>

为什么调用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;
}

img

要先给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;
}
 

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/1099953
  • 这篇博客也不错, 你可以看下memcpy函数是怎么样实现的
  • 同时,你还可以查看手册:将一个缓冲区复制到另一个-memcpy, memcpy_s 中的内容
  • 除此之外, 这篇博客: C语言memcpy等内存操作函数使用介绍中的 memcpy 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 内存拷贝

    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对内存重叠的操作不太友好

  • 您还可以看一下 尹成老师的C语言系列之 内存操作课程中的 memcpy小节, 巩固相关知识点