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

C语言Segmentation Fault问题求助:strcpy导致崩溃如何修复

解决C语言中strcpy导致的Segmentation Fault问题

问题根源

你的代码里char *str = NULL;定义了一个空指针,strcpy函数需要将字符串复制到已分配且有足够空间的有效内存地址,而NULL指向的是操作系统不允许访问的无效内存,往这里写数据直接触发段错误(Segmentation Fault)。

三种可行解决方案

方案1:使用字符数组(最简单直接)

把空指针替换为足够大的字符数组,数组会在栈上自动分配内存,能直接容纳目标字符串(记得留足字符串结束符'\0'的空间)。

修改后的完整代码:

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

int main(void)
{
    int     i = 0, num = 0;
    double  j = 0;
    char    str[20]; // 替换原NULL指针为字符数组,大小足够容纳目标字符串

    printf("Enter the number: ");
    scanf("%d", &num);

    for (i = 0; i < num; i++) {
        j = i / 3 + i;
        printf("j = %lf \n", j);
    }

    strcpy(str, "Success!");
    printf("%s\n", str); 

    return 0;
}

方案2:动态分配内存(适合灵活场景)

用malloc手动分配内存,用完后记得用free释放,避免内存泄漏。分配时要计算目标字符串的长度加1(存放结束符)。

修改后的完整代码:

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

int main(void)
{
    int     i = 0, num = 0;
    double  j = 0;
    char    *str = NULL;

    printf("Enter the number: ");
    scanf("%d", &num);

    for (i = 0; i < num; i++) {
        j = i / 3 + i;
        printf("j = %lf \n", j);
    }

    // 分配足够内存:字符串长度+1(结束符)
    str = malloc(strlen("Success!") + 1);
    if (str == NULL) { // 必须检查malloc是否成功,避免分配失败后继续操作
        perror("malloc failed");
        return 1;
    }
    strcpy(str, "Success!");
    printf("%s\n", str); 

    free(str); // 释放动态分配的内存
    return 0;
}

方案3:直接使用字符串字面量(仅适用于无需修改字符串的场景)

如果只是要输出"Success!",不需要后续修改这个字符串,可以直接让指针指向字符串字面量,省去strcpy步骤:

修改后的关键代码片段:

// 替换原char *str = NULL;
char *str = "Success!";

// 去掉strcpy(str, "Success!");这一行
printf("%s\n", str); 

注意:字符串字面量存储在只读内存区域,不能通过指针修改内容,否则会触发未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:04