我无法处理,看不到我的代码出了什么问题。

尝试通过IP打印(我怀疑是站点的)名称,但我无法在3天内这样做,这使我感到沮丧。

所以,我的代码:


/**
 * task1.c -- getnameinfo() usage example
 *
 * Copyright (c) 2014 Ovchinnikov Alexzander
 *
 * This code is licensed under a MIT-style license.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#include <arpa/inet.h>

#include <locale.h>

/**
 * main
 * @param argv количество параметров командной строки (учитая имя программы)
 * @param argv массив строк-параметров командной строки
 */
int main(int argc, char *argv[])
{
    int result;
    struct sockaddr_in *sa;    /* input */
    char hbuf[NI_MAXHOST];

    /*
     * Инициализация подсистемы locale
     */
    (void) setlocale(LC_ALL, "");

    /*
     * Должен быть один и только один аргумент командной строки
     */
    if (2 != argc) {
        fprintf(stderr, "usage: %s IPv4 address\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /*
    * Что-то делаем
    */
    sa->sin_family = AF_INET;
    sa->sin_port = htons(80);
    result = inet_pton(AF_INET, argv[1], &(sa->sin_addr));
    if (result <= 0){
        if (result == 0){
                fprintf(stderr, "Not in presentation format");
        }else{
            perror("inet_pton");
            exit(EXIT_FAILURE);
        }
    }
    memset(&sa->sin_zero, '\0', sizeof(sa->sin_zero));

    /*
     * Получить имя для адреса в argv[1]
     */
    if (0 != (result = getnameinfo((struct sockaddr *)sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD))){
        fprintf(stderr, "getnameinfo() error: %s\n", gai_strerror(result));
    }else{
        fprintf(stdout, "host:%s\n", hbuf);
    }

    return 0;
}


编译时:

gcc -Wall -o task1_2 task1_2.c


,我得到这个:

task1_2.c:49:20: warning: ‘sa’ may be used uninitialized in this function
[-Wmaybe-uninitialized]

sa->sin_family = AF_INET;


当这样运行时:

./task1_2 87.240.131.120


,我遇到了细分错误。

最佳答案

您尚未为sa分配内存

sa = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));

关于c - 尝试通过传递IP(getnameinfo)打印名称时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22310469/

10-11 22:39
查看更多