C语言中向函数传递字符串数组参数出现段错误求助
解决字符串数组传递时的段错误问题
你的代码出现段错误主要有两个关键问题,咱们一步步拆解:
1. 未初始化的指针数组元素
你声明了char *str[2];,这是一个包含2个字符指针的数组,但这些指针没有指向任何有效的内存空间。当你用scanf("%s", (str+i))的时候,相当于把输入的字符串直接写入一个随机的内存地址(野指针指向的区域),这必然会触发段错误——操作系统不允许程序访问未授权的内存。
2. 函数未提前声明
display函数在main函数之后定义,但你没有在main之前声明它。虽然这不一定直接导致段错误,但这是C语言的标准错误,编译器会默认它返回int类型,可能引发未定义行为。
修复后的代码(动态内存版本)
#include<stdio.h> #include<stdlib.h> #include<string.h> // 提前声明display函数,让编译器知道它的参数和返回类型 void display(char **p); int main() { char *str[2]; // 为每个指针分配足够的内存,这里假设每个字符串最多100个字符 for(int i=0;i<2;i++) { str[i] = malloc(101 * sizeof(char)); // 多留1个位置存字符串结束符'\0' if(str[i] == NULL) { perror("malloc failed"); return 1; } scanf("%s", str[i]); // 直接用str[i],比(str+i)更直观 } display(str); // 别忘了释放分配的内存,避免内存泄漏 for(int i=0;i<2;i++) { free(str[i]); } return 0; } void display(char **p) { for(int i=0;i<2;i++) { printf("%s \n",p[i]); } }
关键修复点说明
- 为指针分配内存:用
malloc给每个字符串指针分配足够的空间,这里设的是101个字符(包含结束符),你可以根据实际需求调整大小。同时要检查malloc是否成功,避免分配失败后继续操作。 - 提前声明函数:在
main之前声明display,让编译器明确它的类型信息。 - 释放内存:使用完动态分配的内存后,用
free释放,避免内存泄漏。
另一种方案:固定大小二维数组
如果你不想用动态内存,也可以直接声明二维字符数组,这样每个字符串都有固定的内存空间,也能避免野指针问题:
#include<stdio.h> #include<stdlib.h> #include<string.h> // 注意参数类型是指向数组的指针 void display(char (*p)[101]); int main() { char str[2][101]; for(int i=0;i<2;i++) { scanf("%s", str[i]); } display(str); return 0; } void display(char (*p)[101]) { for(int i=0;i<2;i++) { printf("%s \n",p[i]); } }
内容的提问来源于stack exchange,提问作者heapster
相关产品推荐
相关产品推荐

