C语言程序错误排查请求:请分析函数功能、main输出并定位问题
C语言程序错误分析、函数功能及输出说明
一、程序存在的错误
- 内存访问非法:
char* string3="\0";定义的是字符串常量,存储在只读数据段。函数f中对*tp3++的赋值操作试图修改只读内存,会触发未定义行为,通常表现为程序崩溃或异常。 - 逻辑与需求不符:需求是将
string2和string1的内容追加到string3之后,但函数f实际是把string1和string2逆序拷贝到目标空间,完全违背需求。
二、函数f的实际功能
函数f的执行流程如下:
- 遍历
p1和p2,找到两个字符串的末尾位置 - 从
p1的最后一个有效字符开始,逆序将内容拷贝到p3指向的内存 - 接着从
p2的最后一个有效字符开始,逆序拷贝到p3的后续空间 - 在拷贝完成后添加字符串结束符
\0,返回p3的起始地址
简单来说,该函数是把string1和string2分别逆序后拼接,存入p3指向的内存区域。
三、main函数的输出情况
由于string3指向只读内存,函数f中的写入操作会触发未定义行为,程序几乎必然崩溃,无法正常输出内容;即使侥幸未崩溃,输出的也是不可预测的垃圾数据。
修复方案示例
如果要实现需求中的功能,需要做两处修改:
- 给
string3分配可写且足够大的内存:char string3[20] = "\0"; // 大小需容纳string1+string2的长度+1 - 修改函数
f为正序拷贝逻辑:char* f(char *p1, char *p2, char *p3) { char* tp3 = p3; // 正序拷贝string1到p3 while (*p1) *tp3++ = *p1++; // 正序拷贝string2到p3后续 while (*p2) *tp3++ = *p2++; *tp3 = 0; return p3; }
内容的提问来源于stack exchange,提问作者Isidoro D'arco
相关产品推荐
相关产品推荐

