#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,就会出现分割错误。
发布于 2014-07-12 11:24:00
宣言
const struct addrinfo *hints;将hints声明为指向常量结构的指针,即只读结构,不能更改。
此外,您的hints分配是错误的,因为您分配了10个指针(这是40或80个字节,取决于您是在32位或64位平台上)。您应该分配sizeof(*hints)字节。
而且,malloc调用没有初始化它分配的内存,这意味着未初始化的成员字段中的数据将是不确定的,因此getaddrinfo调用将导致未定义行为。首先通过使用calloc或使用memset来清除结构。
实际上,您根本不需要动态分配该结构,只需将其声明为正常局部变量,并使用address-of运算符&传递一个指针。
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, ...);现在您有一个内存泄漏,因为您没有释放分配的内存。使用结构(而不是指向结构的指针),您不必担心这一点。
发布于 2014-07-12 11:28:29
您将hints定义为指向常数结构的指针。
const struct addrinfo *hints;因此,您不会更改此结构和代码的数据成员。
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;至少可以代替
return getaddrinfo (hostNameOrIPAddress,
serviceOrPortNum,
hints,
resultOfGetAddrInfo) != 0;程序不删除已分配的内存。
https://stackoverflow.com/questions/24712397
复制相似问题