【问题标题】:initializing a structure pointer - c初始化结构指针 - c
【发布时间】:2013-06-10 15:02:19
【问题描述】:

对不起,如果这是一个太简单的问题。我试图编译一些套接字调用代码,我不得不使用这个

SOCKADDR_IN * sin;
sin.sin_addr.s_addr    = htonl(INADDR_ANY);   

问题是我被告知我必须初始化指针。 (有必要吗?)顺便说一句,如何初始化结构指针?

【问题讨论】:

    标签: c pointers initialization structure


    【解决方案1】:

    您必须为SOCKADDR_IN 实例分配内存。不过,您不必创建指针;您可以改为在堆栈上分配它

    SOCKADDR_IN sin;
    sin.sin_addr.s_addr    = htonl(INADDR_ANY);
    

    如果您想将sin 传递给需要SOCKADDR_IN* 的函数,请使用地址运算符&

    SOCKADDR_IN sin;
    sin.sin_addr.s_addr    = htonl(INADDR_ANY);
    ....
    function_using_socket_pointer(&sin);
    

    更新:您似乎想使用动态分配的指针。您可以使用

    SOCKADDR_IN* sin = malloc(sizeof(*sin));
    if (sin == NULL) {
        /* insert oom handling here */
    }
    sin.sin_addr.s_addr    = htonl(INADDR_ANY);
    ....
    free(sin);
    

    【讨论】:

    • 哦,谢谢,我知道了,但我想知道是否有初始化结构指针的特定方法?
    【解决方案2】:

    您想在堆栈上声明一个而不是作为指针。指针只是一个内存地址,而不是对象的实际实例。

    只需将代码更改为

    SOCKADDR_IN sin;
    sin.sin_addr.s_addr    = htonl(INADDR_ANY);   
    

    然后当你需要使用它时,取它的地址是这样的:&sin

    编辑原始问题答案

    如果你真的想初始化一个指针,可以这样做:

    SOCKADDR_IN* sin = (SOCKASSR_IN*)malloc(sizeof(SOCKADDR_IN));
    ....use sin....
    free(sin);
    

    这将在堆上分配内存,大小设置为 SOCKADDR_IN 结构的大小。但如前所述,这是不必要的,通常应该避免,除非您需要在当前堆栈框架(函数)之外使用此结构。

    【讨论】:

    • 哦,谢谢,我知道了,但我想知道是否有初始化结构指针的特定方法?
    • 编辑我的答案来回答这个问题
    • 谢谢,如果我错了,请告诉我,但是当我使用 & 检索局部变量并在其他函数中使用它时,当
    • @Salgar 最好实践not to cast the return from malloc。如果您分配 sizeof(*sin) 字节(它现在相当于 sizeof(SOCKADDR_IN),但如果您将来更改 sin 的类型,它将继续工作)
    • @Newben 堆栈分配通常比malloc 快得多。更重要的是,您必须记住调用free 以获得动态分配的内存;堆栈上的变量在超出范围时会自动回收它们的存储空间。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多