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

C语言无法将字符串复制到指针,出现段错误寻求帮助

你的C语言指针问题分析与修正方案

代码里的核心错误点

  • 函数名非法:原函数pointer copy包含空格,C语言函数名不允许有空格,且你在main里调用的是copy,函数名需改为合法标识符。
  • 字符串初始化错误:char x='password'; 单引号仅用于单个字符,字符串必须用双引号;且单个char变量存不下整个字符串,需用字符数组或字符串指针。
  • 二级指针赋值错误:你想通过二级指针修改主函数的指针,但直接给result赋值只会修改形参本身,无法影响实参。正确做法是给*result赋值,因为result指向主函数中encrypted_message的地址,*result就是encrypted_message本身。
  • 局部变量内存失效:如果用局部字符数组存储字符串,函数执行结束后该内存会被释放,后续访问会触发段错误。必须用动态分配内存来保留数据。
  • 语法细节错误:printf中的换行符应为\n,free(encrypted_message)缺少分号。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int copy(char **result) {
    const char *source_str = "password";
    // 动态分配内存,+1是为了存储字符串结束符'\0'
    *result = (char *)malloc(strlen(source_str) + 1);
    if (*result == NULL) {
        // 内存分配失败返回错误码
        return -1;
    }
    // 复制字符串到分配的内存
    strcpy(*result, source_str);
    return 0;
}

int main(void) {
    char *encrypted_message = NULL;
    if (copy(&encrypted_message) == 0) {
        if (encrypted_message != NULL) {
            printf("%s\n", encrypted_message);
        }
        // 释放动态分配的内存,避免泄漏
        free(encrypted_message);
        encrypted_message = NULL; // 标记为NULL,防止野指针
    }
    return 0;
}

关键修正说明

  1. 用malloc动态分配内存,确保字符串在函数结束后依然有效,不会被系统回收。
  2. 用strlen获取字符串长度,加1是因为C语言字符串必须以'\0'作为结束标志,否则printf等函数会读取到垃圾数据。
  3. 检查malloc的返回值,避免内存分配失败导致的后续错误。
  4. 正确使用二级指针*result赋值,让主函数的encrypted_message指向有效内存。
  5. 释放内存后将指针置为NULL,避免后续误操作野指针。

内容的提问来源于stack exchange,提问作者idkDude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:24:09