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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:45:28