C语言TCP服务器读取IPv4参数时触发Bus error: 10问题排查
解决TCP服务器启动时的Bus Error:10问题
问题根源
你遇到的bus error:10是因为操作了未初始化的野指针:
- 代码中先定义
char *ip;,此时ip是未初始化的野指针,指向内存中的随机地址。 - 紧接着调用
memset(ip, 0, sizeof(char)*15),试图往这个随机地址写入数据,属于非法内存访问,直接触发总线错误。 - 另外还有一个潜在问题:IPv4地址最长为15个字符(如
255.255.255.255),但C字符串需要末尾的\0终止符,所以分配15字节内存会导致strcpy写入越界,引发未定义行为。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netdb.h> #include <string.h> int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Error: Incorrect number of arguments.\n"); return -1; } else { fprintf(stdout, "Arguments good\n"); } // 分配足够内存(15字符+终止符)并检查分配结果 char *ip = malloc(sizeof(char) * 16); if (ip == NULL) { fprintf(stderr, "Error: Failed to allocate memory.\n"); return -1; } // 先分配内存再初始化 memset(ip, 0, sizeof(char) * 16); strcpy(ip, argv[1]); int portNo = atoi(argv[2]); fprintf(stdout, "IP: %s Port: %d\n", ip, portNo); free(ip); return 0; }
更简洁的写法(用calloc)
calloc可以一次性完成内存分配和清零操作,省去单独调用memset的步骤:
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netdb.h> #include <string.h> int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Error: Incorrect number of arguments.\n"); return -1; } else { fprintf(stdout, "Arguments good\n"); } // calloc自动将内存初始化为0 char *ip = calloc(16, sizeof(char)); if (ip == NULL) { fprintf(stderr, "Error: Failed to allocate memory.\n"); return -1; } strcpy(ip, argv[1]); int portNo = atoi(argv[2]); fprintf(stdout, "IP: %s Port: %d\n", ip, portNo); free(ip); return 0; }
关键注意事项
- 任何动态内存分配函数(malloc/calloc/realloc)的返回值必须检查,避免内存分配失败后操作空指针。
- 处理C字符串时,一定要为末尾的
\0终止符预留额外的内存空间。
内容的提问来源于stack exchange,提问作者MustardMan6079
相关产品推荐
相关产品推荐

