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

C语言中将数组复制到另一数组指定索引位置的问题排查

C语言数组指定位置复制问题修正

存在的问题

  • 变量名不匹配:定义的动态数组指针为_data,但后续memcpy操作和打印逻辑中调用的是未定义的data变量,这是导致输出异常的核心原因,未定义变量的内存访问行为完全不可控。
  • 起始索引不符合预期:你期望从索引3开始存储内容,但代码中index初始值设为4U,C语言数组索引从0开始计数,偏移4对应的是第5个存储位置,和预期偏移3不符。
  • 复制长度语义不严谨:当前使用sizeof(uint32_t)作为复制长度,虽然多数平台下该值为4,刚好匹配"TEST"的字符长度,但该写法和你要复制的字符串内容无语义关联,可读性差,后续如果修改name数组内容会出现长度不匹配的问题。
  • 动态内存未初始化:malloc分配的内存是未初始化的垃圾值,如果你打印索引0到2的位置,会输出不可预期的乱码。

修正后的代码

复制逻辑

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// 动态数组分配,用calloc直接初始化内存为0,避免乱码
uint8_t* data = (uint8_t *)calloc(8U*1024, sizeof(uint8_t));
uint32_t index = 3U; // 起始索引改为3,符合需求
uint8_t name[] = "TEST";
// 复制4个有效字符,不需要末尾'\0'就减1,需要保留结束符则直接用sizeof(name)
memcpy(&data[index], name, sizeof(name) - 1);
index += sizeof(name) - 1;

打印逻辑

如果只需要打印复制的内容,可以调整遍历起始位置:

// 仅打印复制的TEST部分
for (int j = 3; j < index; j++)
{
    printf("%c \n", data[j]);
}

// 如果要打印从0到index的全部内容,已用calloc初始化,前3位是空字符
for (int j = 0; j < index; j++)
{
    printf("%c \n", data[j]);
}

补充说明

如果需要复制后的内容是标准C字符串,可以将复制长度改为sizeof(name),会自动把name末尾自带的'\0'结束符也复制到目标数组中。

内容的提问来源于stack exchange,提问作者TheQuietOne96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:06:04