C语言指针强转为数组类型报错原因及字符串指定范围字符提取方法
报错的底层原因
- C语言标准明确规定:强制类型转换的目标类型不能是数组类型,仅支持转换为
void、标量类型(指针、整数、浮点数等)、结构体、联合体类型。你代码中(char[2])c试图把char*类型的指针转换为数组类型char[2],属于语法层面的非法操作,所以编译器会直接抛出cast specifies array type错误。 - 你遗漏了C语言中数组和指针的核心差异:数组是一块连续的固定长度内存空间的类型,而指针是存储内存地址的变量。除了
sizeof、取地址&等少数场景外,数组在表达式中会自动隐式转换为指向首元素的指针,但反向的指针转数组的操作从来都不被允许。
修复方案
你不需要做数组强转,memcpy的第二个参数本身接受const void*类型,直接传入指针即可,还可以根据你的提取需求调整拷贝起始位置和长度:
场景1:拷贝完整字符串
修正后的代码如下,同时修复了你原来代码中拷贝长度越界的问题:
char *c = "hello"; // "hello"包含末尾的\0共6字节,直接分配对应大小即可 char *x = malloc(6); if (x != NULL) { // 无需强转,直接传c,拷贝长度设为6,刚好覆盖完整字符串 memcpy(x, c, 6); printf("%s\n", x); free(x); }
场景2:提取指定范围的字符
比如你要提取从下标n开始的k个字符,只需要偏移指针+调整拷贝长度即可,如下提取前2个字符的示例:
char *c = "hello"; // 2个字符加末尾\0需要3字节空间 char *x = malloc(3); if (x != NULL) { // 从c的首地址开始拷贝2个字节 memcpy(x, c, 2); // 手动补字符串结束符 x[2] = '\0'; printf("%s\n", x); // 输出he free(x); }
如果要提取从第2个字符开始的3个字符(即llo),修改为memcpy(x, c+2, 3);,对应空间分配4字节即可。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

