测试K&R第106页改写的strcpy1函数遇问题,请求技术协助
问题分析与修复方案
嘿,我来帮你搞定这个strcpy1的问题~你的函数实现本身是没问题的,核心问题出在目标指针n没有指向有效的可写内存,咱们一步步来看:
为什么代码会出错?
你定义了char *n;但没给它分配内存空间,这时候n是一个「野指针」——它指向内存里的随机位置,直接用strcpy1往这个位置写数据会触发未定义行为(程序崩溃、输出乱码或者看似正常但埋下隐患都是可能的)。
而char *m = "Love is beautiful";是指向字符串常量的指针,这部分是没问题的,因为咱们只是从这里读取数据。
两种修复方案
方案1:用数组分配固定大小的内存
这是最简单的方式,直接在栈上定义一个足够大的数组来存放复制后的字符串:
#include<stdio.h> void strcpy1(char *s, char *t); int main() { char *m = "Love is beautiful"; // 定义数组,大小要足够容纳目标字符串(包括末尾的'\0') char n[100]; // 这里100完全够用,也可以根据实际需求调整 strcpy1(n, m); printf("%s", n); return 0; } void strcpy1(char *s, char *t) { while (*s++ = *t++) ; }
数组n会在程序运行时自动分配栈内存,strcpy1往里面写数据是安全的。
方案2:用malloc动态分配内存
如果不知道字符串的具体长度,或者需要更灵活的内存管理,可以用动态分配:
#include<stdio.h> #include<stdlib.h> // 必须包含malloc/free的头文件 #include<string.h> // 用strlen计算字符串长度 void strcpy1(char *s, char *t); int main() { char *m = "Love is beautiful"; // 分配刚好足够的内存:字符串长度 + 1(用来存结束符'\0') char *n = malloc(strlen(m) + 1); // 一定要检查malloc是否成功,避免空指针错误 if (n == NULL) { printf("内存分配失败!\n"); return 1; } strcpy1(n, m); printf("%s", n); free(n); // 动态分配的内存用完记得释放,避免内存泄漏 return 0; } void strcpy1(char *s, char *t) { while (*s++ = *t++) ; }
这种方式需要注意:必须检查malloc的返回值(如果内存不足会返回NULL),而且用完内存后要调用free释放。
补充说明
你的strcpy1实现是完全符合K&R里的逻辑的,和标准库strcpy的核心逻辑一致——问题完全出在调用前的内存准备上,标准库的strcpy也要求目标指针必须指向有效的可写内存哦~
内容的提问来源于stack exchange,提问作者Nien Van
相关产品推荐
相关产品推荐

