#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/