为何将char指针强制转为char(*)[2]后memcpy仍复制完整字符串?
问题解答:C语言数组指针强制转换后memcpy复制长度不符合预期的原因
核心认知误区梳理
memcpy的复制字节数完全由第三个参数决定,和源/目标指针的类型无关。你代码中第三个参数是sizeof("hello"),值为6(包含字符串末尾的\0),自然会把完整的hello全部复制到x指向的内存中,和你是否对c做数组指针转换没有任何关系。- 对指针做强制类型转换,只会改变该指针的「类型解读规则」,不会修改指针本身存储的内存地址值。你把
c转为char(*)[2](指向长度为2的char数组的指针)后,它仍然指向原字符串hello的首地址,作为memcpy的源参数传入时,只会被隐式转为void*传递地址,不会自动限制读取的长度。 - 你提到的评论建议
(char*[2])c存在类型错误:char*[2]是「长度为2的char指针数组」类型,不是数组指针,将char*强制转为数组类型本身不符合C语言的类型规则,实际运行会触发未定义行为。
实现提取前N个字符的正确写法
如果要利用数组指针类型的长度特性来控制复制长度,需要将sizeof作用在解引用后的数组类型上获取对应长度,示例代码如下:
char *c = "hello"; char *x = malloc(3); // 存储2个字符+1个字符串结束符 // sizeof(*(char(*)[2])c) 会得到2,即数组指针指向的数组的总长度 memcpy(x, c, sizeof(*(char(*)[2])c)); x[2] = '\0'; // 手动补充字符串结束符 printf("%s\n", x); // 输出结果为"he"
关于是否可以通过数组类型转换提取指定范围字符的回答
是可以的,但不是直接转换指针传入memcpy就会生效,本质是利用sizeof对数组类型求值为数组总字节数的特性,间接获取你想要的截取长度,核心逻辑还是靠控制memcpy的第三个参数实现范围截取。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

