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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:13:54