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
相关产品推荐
相关产品推荐

