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

C语言将数组奇数索引元素拷贝到动态分配数组问题求助

问题根因说明
  • 核心赋值逻辑错误:同时使用了「指针偏移索引赋值」和「指针自增」两种寻址方式,导致写入位置完全错位。处理索引为1的元素时,给charPointer[1]赋值后又让charPointer自增,后续写入位置会越来越偏移,中间大量地址未被正确赋值,是只能读到第一个有效元素的直接原因。
  • scanf参数错误:charArray长度为16,%16s会最多写入16个字符+1个隐含的\0,总共17字节,发生数组越界,应当改为%15s限制输入长度。
  • 动态内存分配不符合要求:按固定数组长度的一半分配空间,没有考虑用户实际输入的字符串长度,无法实现「恰好足够的存储空间」的要求,同时没有预留字符串结束符\0的存储空间。
  • 目标字符串未补结束符:拷贝完成后没有手动给charPointer指向的数组末尾添加\0,后续打印时会访问到野内存,输出异常内容。
修正后代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char charArray[16];
    printf("Enter string: ");
    // 限制最多输入15个字符,留1位存\0
    scanf("%15s", charArray);
    
    int src_len = strlen(charArray);
    // 奇数索引元素个数为src_len / 2,加1位存\0
    int dst_size = src_len / 2 + 1;
    char *charPointer = malloc(dst_size * sizeof(char));
    if (charPointer == NULL) {
        perror("malloc failed");
        return 1;
    }
    // 存储动态内存的初始地址,用于后续释放和打印
    char *dst_head = charPointer;

    for (char *p = charArray; *p != '\0'; p++) {
        if ((p - charArray) % 2 != 0) {
            printf("待拷贝元素:%c\n", *p);
            // 直接给当前指针位置赋值即可,不需要叠加源数组的偏移
            *charPointer = *p;
            charPointer++;
        }
    }
    // 手动添加字符串结束符
    *charPointer = '\0';

    // 打印结果
    printf("拷贝结果:");
    char *d = dst_head;
    while(*d != '\0') {
        printf("%c", *d++);
    }
    printf("\n");

    // 释放动态内存避免泄漏
    free(dst_head);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:54:03