C语言可变长度字符串数组使用strcpy出现段错误问题排查
问题根因
- 你在main中定义的
char array[n][300]是二维char数组(变长数组VLA),每个元素是长度为300的char数组;但addWords函数的形参定义为char *array[][300],这是二维char指针数组,两种类型完全不匹配。传参后函数内部访问array[x]时会把数组里的字符值当做指针地址解析,访问非法内存直接触发段错误。 - 原代码没有引入
<stdio.h>、<string.h>头文件,部分编译器会默认做隐含函数声明,也会导致运行行为异常。
修复方案
修改函数形参类型,和传入的二维数组类型匹配即可,修复后完整代码如下:
#include <stdio.h> #include <string.h> // 形参改为指向长度300的char数组的指针,和二维数组传参类型匹配 void addWords(char array[][300], int n) { char p[] = "Hello "; char p1[] = "World "; char p2[] = "!"; strcpy(array[0],p); strcpy(array[1],p1); strcpy(array[2],p2); printf("%s%s%s\n",array[0],array[1],array[2]); } int main(int argc, char const *argv[]) { int n = 3; char array[n][300]; addWords(array,3); return 0; }
额外注意事项
- 若要适配任意n的使用场景,需要在函数内部做边界校验,避免写入超过n个元素触发数组越界。
- 建议使用
strncpy替代strcpy,指定最大拷贝长度为299(预留末尾\0的存储位置),避免待拷贝的字符串过长溢出数组。
内容的提问来源于stack exchange,提问作者digolira2
相关产品推荐
相关产品推荐

