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

测试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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:53:48