字符数组printf输出异常:为何两次printf结果不一致?
代码两次printf输出不一致,前两项乱码的原因
注:instrct_content数组仅存储"main"、"lab1"、"lab2"、"lab3"、"lab4"和"lab5"字符串
char** instrct_content = (char**)malloc(sizeof(char)); while(scanf("%s", str) != EOF){ if (strrchr(str, ':') != NULL){ instrct_content = (char**)realloc(instrct_content, sizeof(char)); instrct_content[instrct_cnt] = (char*)malloc(sizeof(char)); instrct_content[instrct_cnt] = strcpy(instrct_content[instrct_cnt], str); printf("%s ", instrct_content[instrct_cnt]); // (1) instrct_cnt +=1; } for (int i=0; i<instrct_cnt; i++){ printf("%s ", instrct_content[i]); // (2) }
问题现象
代码中(1)处的printf能正确输出目标字符串(如main: lab1: lab2: lab3: lab4: lab5:),但(2)处的printf输出结果前两项出现乱码(如�gM �gM lab2: lab3: lab4: lab5:)。
异常原因分析
出现乱码的核心原因是多次内存分配的尺寸完全错误,导致内存越界和堆结构破坏,具体问题点如下:
- 指针数组的内存分配错误:
instrct_content是char**类型的指针数组,每个元素是占4/8字节的char*指针,但初始化和每次realloc时都只分配1字节空间,完全存不下指针数据。随着元素增加,内存不断溢出,后续写入的指针会覆盖之前的有效数据,破坏堆管理结构,导致后续访问时出现无效地址。 - 字符串内存分配错误:为每个字符串分配内存时仅申请1字节,远小于目标字符串的长度,执行
strcpy时会越界写入,直接覆盖堆中其他区域的数据(包括instrct_content里的指针)。虽然(1)处能临时正确输出,但后续的内存操作会进一步破坏堆结构,导致(2)处访问前两项时,指针已被篡改,指向无效内存区域,最终输出乱码。
内容的提问来源于stack exchange,提问作者Dohye Kim
相关产品推荐
相关产品推荐

