c - 错误 : assignment of member ai_family in read-only object

标签 c linux sockets gcc

#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;
}

**

错误信息:

**

$ 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,则会出现段错误。

最佳答案

声明

const struct    addrinfo *hints;

hints 声明为指向常量结构的指针,即只读且无法更改的结构。


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

此外,malloc 调用不会初始化它分配的内存,这意味着您未初始化的成员字段中的数据将是不确定的,getaddrinfo 调用将导致 undefined behavior因为那个。首先清除结构,或者使用 calloc或使用 memset .


实际上你根本不需要动态分配那个结构,只需将它声明为一个普通的局部变量,并使用寻址运算符&传递一个指针:

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, ...);

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

关于c - 错误 : assignment of member ai_family in read-only object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712397/

相关文章:

c - 从数组进行简单的 unsigned long long 转换

c++ - 有什么方法可以方便地为 Winsock send() 生成 HTTP header ,而不是手动连接字符串?

c - 使用 libssh 没有可用的身份验证方法

c - 判断页面是否在内存中?

内核终端中的光标

linux - 为什么我不能访问这个文件夹?

linux - 如何从文本文件生成制表符分隔文件?

Node.js - 在同一端口上使用 Socket.io 和 Express

c - 使用 BSD 套接字模拟事件的 FTP 连接

javascript - socketio 客户端静静地失去连接并创建新的套接字(传输关闭)