我正在制作一个TCP服务器和客户端,作为服务器程序的一部分,它需要在函数调用时使用一个IPv4地址和端口号作为参数.

#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");
    }
    char *ip;
    memset(ip, 0, sizeof(char) * 15);
    ip = malloc(sizeof(char) * 15);
    strcpy(ip, argv[1]); 
    int portNo = atoi(argv[2]);

    fprintf(stdout, "IP: %s Port: %d\n", ip, portNo);
    
    free(ip);
    return 0;
}

然而,当我在终端(./myServer 127.0.0.1 50000)中编译并运行它时,我得到bus error: 10 我假设我在为IP分配内存或将argv[1]复制到IP中做了一些错误的事情,但我还不能弄清楚是什么.

推荐答案

当您将ip传递给memset时,它未被初始化,因此您正在取消引用无效的指针.这会触发undefined behavior,在这种情况下会导致崩溃.

先分配内存,then清空:

char *ip = malloc(sizeof(char) * 15);
memset(ip, 0, sizeof(char) * 15);

更好的是,同时做这两件事:

char *ip = calloc(15, sizeof(char));

此外,您没有分配足够的空间,因为像192.168.100.100这样的IP需要一个16字节的缓冲区.

char *ip = calloc(16, sizeof(char));

更好的方法是使用INET_ADDRSTRLEN,它在netinet/in.h中定义:

char *ip = calloc(INET_ADDRSTRLEN, sizeof(char));

C++相关问答推荐

如何从TPS特定的TGPT_PUBLIC数据 struct 中以OpenSSL的EVP_PKEY

在struct中调用函数,但struct在void中 *

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

当输入负数时,排序算法存在问题

CSAPP微型shell 实验室:卡在sigprocmask

在句子中转换单词的问题

这个计算C中阶乘的函数正确吗?

I2C外设在单次交易后出现故障

如何在提取的索引中分配空值?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

Zlib:解压缩大文件导致";无效代码长度设置";错误

为什么我在C代码中得到一个不完整的类型?

如何将两个uint32_t值交织成一个uint64_t?

如何将大写/小写土耳其字母相互转换?

C-try 将整数和 struct 数组存储到二进制文件中

为什么Linux无法映射这个PT_LOAD ELF段?

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

C中的空指针是什么(_N)?

为什么写入关闭管道会返回成功

malloc:损坏的顶部大小无法找出问题