首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:在只读对象中分配成员ai_family

错误:在只读对象中分配成员ai_family
EN

Stack Overflow用户
提问于 2014-07-12 11:20:04
回答 2查看 6.9K关注 0票数 1
代码语言:javascript
复制
#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>

/// Global declarations:
const char  *hostNameOrIPAddress;
const char  *serviceOrPortNum;
const struct    addrinfo *hints;
struct addrinfo **resultOfGetAddrInfo;
int     socketFd;

int fillUpStructSockaddrIn ()
{
  hostNameOrIPAddress   = "127.0.0.1";
  serviceOrPortNum  = "1234";

  hints = malloc (sizeof (struct addrinfo*) * 10);
  hints->ai_family   = AF_UNSPEC;
  hints->ai_socktype = SOCK_STREAM;
  hints->ai_flags    = AI_PASSIVE;

  if (getaddrinfo (hostNameOrIPAddress,
          serviceOrPortNum,
          hints,
          resultOfGetAddrInfo) != 0)
    // Indicate some error.
    return 1;

  return 0;
}

int main ()
{
  if (fillUpStructSockaddrIn() != 0)
    return 1;

  socketFd = socket (AF_INET, SOCK_DGRAM, 0);

  return 0;
}

**

错误消息:

**

代码语言:javascript
复制
$ gcc server.c 
server.c: In function ‘fillUpStructSockaddrIn’:
server.c:35:3: error: assignment of member ‘ai_family’ in read-only object
   hints->ai_family   = AF_UNSPEC;
   ^
server.c:36:3: error: assignment of member ‘ai_socktype’ in read-only object
   hints->ai_socktype = SOCK_STREAM;
   ^
server.c:37:3: error: assignment of member ‘ai_flags’ in read-only object
   hints->ai_flags    = AI_PASSIVE;

^

请参见getaddrinfo的声明:

http://linux.die.net/man/3/getaddrinfo

它需要一个const struct addrinfo *hints。我应该如何在其中填充值?

如果我没有malloc,就会出现分割错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-12 11:24:00

宣言

代码语言:javascript
复制
const struct    addrinfo *hints;

hints声明为指向常量结构的指针,即只读结构,不能更改。

此外,您的hints分配是错误的,因为您分配了10个指针(这是40或80个字节,取决于您是在32位或64位平台上)。您应该分配sizeof(*hints)字节。

而且,malloc调用没有初始化它分配的内存,这意味着未初始化的成员字段中的数据将是不确定的,因此getaddrinfo调用将导致未定义行为。首先通过使用calloc或使用memset来清除结构。

实际上,您根本不需要动态分配该结构,只需将其声明为正常局部变量,并使用address-of运算符&传递一个指针。

代码语言:javascript
复制
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family   = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags    = AI_PASSIVE;

getaddrinfo(..., &hints, ...);

现在您有一个内存泄漏,因为您没有释放分配的内存。使用结构(而不是指向结构的指针),您不必担心这一点。

票数 1
EN

Stack Overflow用户

发布于 2014-07-12 11:28:29

您将hints定义为指向常数结构的指针。

代码语言:javascript
复制
const struct    addrinfo *hints;

因此,您不会更改此结构和代码的数据成员。

代码语言:javascript
复制
  hints->ai_family   = AF_UNSPEC;
  hints->ai_socktype = SOCK_STREAM;
  hints->ai_flags    = AI_PASSIVE;

是错的。

即使结构不是常数,上面的语句也是错误的,因为您没有为结构分配内存。为具有未定义值的指针分配内存。所以程序有未定义的行为。

也是这些声明

代码语言:javascript
复制
  if (getaddrinfo (hostNameOrIPAddress,
          serviceOrPortNum,
          hints,
          resultOfGetAddrInfo) != 0)
    // Indicate some error.
    return 1;

  return 0;

至少可以代替

代码语言:javascript
复制
return getaddrinfo (hostNameOrIPAddress,
              serviceOrPortNum,
              hints,
              resultOfGetAddrInfo) != 0;

程序不删除已分配的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24712397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档