C语言 关于指针和memcpy的一个例子

#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语言里面就是这么用的,一般都有字符串结束标志,防止越界

  • 内存申请的大小只有一个字节,需要改大,如N+1
  • 申请内存后,需要判断是否申请成功,指针判断是否为空
  • 动态申请的内存,需要memset一下,清零

这个程序确实有问题,动态分配了一个字节的内存,却想通过循环使用后面另外九个字节的空间。
且字符应该写成'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字节,指针偏移超过范围,会导致非法访问,这是很可怕的问题,将源数据拷贝到目标位置,目标位置一定要大于等于源内容大小