C语言如何不使用memcpy将数组指针指向内容赋值给新数组
问题原因
你代码里的b = p;写法存在两个本质问题,无法通过编译:
- C语言中数组名是不可修改的左值,不支持直接用
=运算符对整个数组做批量赋值,这是语法层面的硬性限制 p的类型是指向长度为3的int数组的指针(int (*)[3]),而数组名b在表达式中退化为int*类型指针,二者类型不兼容,直接赋值会触发编译器类型错误
无memcpy的实现方案
不需要依赖memcpy的情况下,最直接的实现方式是通过循环逐元素完成拷贝:数组指针p指向数组a,对p解引用即可拿到它指向的整个数组,通过下标访问逐元素给b赋值即可,运行后就能得到你预期的123输出。
修正后的完整代码如下:
#include <stdio.h> int main(void) { int a[3] = {1,2,3}, b[3]; int (*p)[3] = &a; // 逐元素拷贝p指向的数组内容到b for(int i = 0; i < 3; i++) { b[i] = (*p)[i]; } for(int i = 0; i < 3; i++) { printf("%i", b[i]); } return 0; }
注意:
*p必须加括号,因为下标运算符[]的优先级高于解引用运算符*,如果写*p[i]会被编译器解析为*(p[i]),属于非法内存访问,会触发运行时错误。
内容的提问来源于stack exchange,提问作者nicolachter
相关产品推荐
相关产品推荐

