You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:03