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

C语言中使用字符串数组:动态分配练习遇段错误求助

你的段错误原因分析与修复方案

兄弟,一眼就揪出你代码里的问题了——strcpy的参数顺序完全搞反了!

先给你掰扯清楚:C语言里strcpy的语法是strcpy(目标缓冲区, 源字符串),你现在写的strcpy("hello\n", args[c]),是试图把args[c]的内容往字符串常量"hello\n"里写。但字符串常量是存放在只读内存区域的,程序根本没有权限修改它,这直接触发了非法内存访问,也就是你碰到的段错误。

给你修正后的代码:

int wordcount = 5; 
char **args = malloc(wordcount * sizeof(char*)); // 这里可以不用强制转换,更规范
for (int i = 0; i < wordcount; i++) { 
    args[i] = malloc(167 * sizeof(char)); 
} 
int c = 0; 
while(c < wordcount){ 
    strcpy(args[c], "hello\n"); // 交换参数顺序,目标在前,源在后
    c++; 
}

另外再给你提几个小建议:

  • 动态分配的内存一定要记得释放,避免内存泄漏。释放的时候要先循环释放每个args[i],再释放args本身:
    for (int i = 0; i < wordcount; i++) {
        free(args[i]);
    }
    free(args);
    
  • 如果不确定源字符串的长度,建议用strncpy代替strcpy,可以指定最大复制长度,避免缓冲区溢出,比如:
    strncpy(args[c], "hello\n", 166); // 留一个字节给字符串终止符'\0'
    args[c][166] = '\0'; // 确保字符串以'\0'结尾
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:59:01