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
相关产品推荐
相关产品推荐

