C语言函数学习遇段错误(core dumped)及编译警告问题求助
排查你的C语言段错误与编译警告问题
咱们一步步拆解你遇到的问题,先解决最致命的段错误,再处理那些编译警告:
1. 触发段错误的直接原因
你最后一行的printf("%s",*b)是核心问题:
%s格式符要求传入的是字符串的起始地址(char*类型),它会从这个地址开始读取字符直到遇到\0。- 但
*b是对指针b的解引用,得到的是b指向的单个char字符(比如你的string第一个字符s,ASCII值是115)。 - 当你把这个char值传给
%s时,printf会把它当作内存地址(比如0x73)去访问,这个地址大概率是程序无权限访问的内存区域,直接触发段错误(core dumped)。
要打印指针b指向的字符串,直接写printf("%s", b)或者printf("%s", string)就行,不需要解引用。
2. 其他导致编译警告/潜在问题的点
(1)void main不符合C标准
C标准规定main函数的返回类型必须是int,正确写法是:
int main(void) { // 你的代码 return 0; // 结束时返回状态码 }
用void main会导致编译器警告,甚至在部分环境下运行异常。
(2)find函数未声明就调用
你代码里调用了find(a,c,*b),但既没有提前声明这个函数,也没写完定义(void f...)。C语言中如果函数未提前声明,编译器会默认它返回int类型,这会触发隐式声明警告,若函数实际返回类型不是int,还会出现未定义行为。
解决方法:要么在main函数前声明find函数,比如:
void find(int x, int y, char z); // 声明函数原型
要么把find的完整定义写在main函数前面。
(3)find函数的参数传递问题
如果你调用find是想让它修改字符串string的内容,那传*b是错误的——*b是单个字符的值传递,函数里修改这个参数不会影响原字符串。应该传递指针b或者string(即字符串的地址),比如find(a,c,b),同时把find的参数改成char* z。
修正后的示例代码
这里给你改了核心问题的版本,假设find函数做一些简单操作:
#include <stdio.h> // 提前声明find函数 void find(int a, int c, char *str); int main(void) { int a,c; char *b; char string[100]="something"; b = string; printf("\n %s \n\n %c", string, *b); // 打印单个字符用%c,不是%s! printf("\nEnter a and c:-"); scanf("%d %d",&a,&c); find(a,c,b); // 传递指针,不是单个字符 printf("%s", b); // 直接传指针,不需要解引用 return 0; } // 完整定义find函数 void find(int a, int c, char *str) { // 这里写你的函数逻辑,比如修改str的内容 str[0] = 'H'; // 举个例子,把第一个字符改成H }
额外提醒
- 打印单个char字符要用
%c格式符,你之前的printf("\n %s \n\n %s",string,*b)其实也有问题,第二个%s应该改成%c,当时没触发段错误只是运气好,属于未定义行为。 - 编译时建议打开高警告级别(比如gcc用
-Wall -Wextra),能帮你提前发现很多潜在问题。
内容的提问来源于stack exchange,提问作者Khushit Shah
相关产品推荐
相关产品推荐

