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

C语言TCP客户端服务端运行输入userid触发段错误问题咨询

段错误直接触发原因

客户端中char *code是未分配内存的野指针,你直接调用recv(sd,&code,100,0)往指针的内存地址写入100字节数据,严重越界破坏栈结构,这段逻辑在输入userid之前执行,栈被破坏后运行到scanf读取userid时就触发了段错误。


客户端需要修复的问题

  • 所有字符指针code/msg/filename都要分配足够内存,或者直接定义为字符数组,比如改为char code[100], msg[1024], filename[256];,禁止用未初始化的野指针接收数据
  • scanf("%s",&userid);去掉取地址符,改为scanf("%s", userid);,数组名本身就是首地址,加&会导致地址错误
  • 发送密码时send(sd,password,sizeof(password),0);中password是指针,sizeof(password)只会取指针长度(4/8字节),改为send(sd, password, strlen(password)+1, 0);才能发送完整的密码字符串
  • recv函数的第二个参数直接传数组首地址即可,不要加取地址符,比如recv(sd, code, sizeof(code), 0);,之前的&code是取指针本身的地址,逻辑完全错误

服务端需要修复的问题

  • 你调用accept后返回的客户端通信套接字是ad,后续所有send/recv都要用ad,不能用监听套接字sd,比如send(ad,"220",strlen("220")+1,0);,用sd根本无法把数据发给客户端
  • 变量i未初始化,执行while(userid[i]!=' ')时i是随机值,会导致数组越界,定义时初始化为0:int i=0;
  • id数组长度只有3,存储字符后没有手动加'\0'终止符,后续判断id[0]时可能读取到垃圾值,遍历结束后加id[i] = '\0';,或者把id定义为长度4的数组预留终止符位置
  • 调用fopen后必须判断返回值,如果database.txt/studb.txt不存在会返回NULL,后续getline直接触发崩溃
  • 发送字符串时不要硬编码100字节,改为strlen(字符串)+1,避免发送多余的垃圾数据
  • getline的line指针建议初始化为NULL:char *line = NULL;,符合函数的调用规范

内容的提问来源于stack exchange,提问作者Vikneysh Raj G G A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:06:01