#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10
int main(void)
{
char* target=(char*)malloc(sizeof(char));
for(int i=0;i<N;i++){
memcpy(target+i,"a",sizeof(char));
}
puts(target);
free(target);
return 0;
}
看了这个 讲述 memcpy函数的用法的例子,比较困惑, target是指向 malloc分配一个字符的内存的指针, target+i 岂不是越界 无定义的指针,这样写 难道不是错误的吗? 更改 target+i这块内存上的值 ,不是很危险的吗?
malloc不是动态分配内存?target+i应该是地址变了
target + i 访问的是target地址偏移i 处的内存,这块内存没使用的话修改问题不大,但这样写法绝对不可取,内存手动申请,手动释放
target是指向数组第一个字符的指针,加i就是指针往后偏移i位,这样就能给数组的下标位i的元素赋值
你的理解是对的,这个程序问题很大,只申请了一个字节的内存,却试图使用十个字节的数据,等同于数组越界操作。
并且他的这个拷贝操作我实在不敢苟同,使用多字节拷贝函数却只对一个字节进行操作,再用for循环实现多字节拷贝。。。我只能说,比直接for循环里面用赋值效率还要低。
target+i 开始是一段字符串,C语言里面就是这么用的,一般都有字符串结束标志,防止越界
这个程序确实有问题,动态分配了一个字节的内存,却想通过循环使用后面另外九个字节的空间。
且字符应该写成'a'而不是"a","a"后面隐藏了一个'\0'。
C\C++博主,求关注,有问题可以私聊一起探讨
一半内存申请都是按照页申请的,如果只是你申请一个他给你一个会有很多内存被浪费。
函数原型
void memcpy(void destin, void source, unsigned n);
参数
destin-- 指向用于存储复制内容的目标数组
注意,**destin类型强制转换为 void 指针。
source-- 指向要复制的数据源,类型强制转换为 void* 指针。
n-- 要被复制的字节数。
target + i 访问的是target地址偏移i 处的内存,
正确的做法是申请内存。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10
int main(void)
{
char* target=(char*)malloc(sizeof(char)*N); //申请10个内存
for(int i=0;i<N;i++){
memcpy(target+i,"a",sizeof(char));
}
puts(target);
free(target);
return 0;
}
望采纳
一位老程序员说道:使用指针申请的内存,是4字节,指针偏移超过范围,会导致非法访问,这是很可怕的问题,将源数据拷贝到目标位置,目标位置一定要大于等于源内容大小