C89-使用灵活的字符数组和原型初始化结构

C89-使用灵活的字符数组和原型初始化结构,c,arrays,struct,initialization,function-prototypes,C,Arrays,Struct,Initialization,Function Prototypes,我是C新手,对结构实例化有一些疑问。我有两个文件: Index.c:它实例化了一个新的服务器结构 server/server.c它定义了server结构、new\u server()构造函数和kill\u server()解构器 索引.c的内容: /* Standard libraries */ #include <stdio.h> #include <string.h> /* Project's Custom classes */ #include "./serv

我是C新手,对结构实例化有一些疑问。我有两个文件:

  • Index.c
    :它实例化了一个新的
    服务器
    结构
  • server/server.c
    它定义了
    server
    结构、
    new\u server()
    构造函数和
    kill\u server()
    解构器
索引.c的内容

/* Standard libraries */
#include <stdio.h>
#include <string.h>

/* Project's Custom classes */
#include "./server/Server.c"

/* Configuration value */
#define HOST "127.0.0.1"
#define PORT 80

int main (void) {
    unsigned short port = PORT;
    unsigned char host[255] = HOST;
    Server* server = new_Server(port, host);
    return 0;
}
#include <stdlib.h>

/* HOST_NAME_MAX will have to be changed into getconf HOST_NAME_MAX */
#define HOST_NAME_MAX 255

typedef struct {
    unsigned short port;
    unsigned char host[HOST_NAME_MAX];
} Server;

Server* new_Server (unsigned short port, unsigned char host[]) {
    Server* server = malloc(sizeof(Server));
    server->port = port;
    server->host = host;
    return server;
}

void kill_Server (Server* server) {
    free(server);
}
编译程序时,我得到以下输出:

In file included from src/index.c:6:
src/./server/Server.c:11:9: warning: no previous prototype for function 'new_Server' [-Wmissing-prototypes]
Server* new_Server (unsigned short port, unsigned char host[]) {
        ^
src/./server/Server.c:14:15: error: array type 'unsigned char [255]' is not assignable
        server->host = host;
        ~~~~~~~~~~~~ ^
src/./server/Server.c:18:6: warning: no previous prototype for function 'kill_Server' [-Wmissing-prototypes]
void kill_Server (Server* server) {
     ^
2 warnings and 1 error generated.
(我刚刚省略了“server”变量notused警告。)

下面是我的问题:

  • 既然我确实指定了输出和方法参数类型,为什么会收到“缺少原型”警告

  • 如何在结构的“主机”键是字符数组的情况下初始化结构

  • 我所做的事有效率吗?步骤:

  • 在定义中配置值
  • 创建相应的变量
  • 将它们作为构造函数参数传递
  • 初始化结构实例
  • 将该值指定给它的关联键
我读到,要获得最大主机名大小,应该执行“getconf HOST\u NAME\u MAX”。在shell中它当然可以工作,我得到255,但是我想在我的C程序中把值存储在一个变量中

  • 我怎样才能做到这一点
我使用以下GCC标志进行编译:

gcc-g-O0-Wall-Wextra-std=c89-pedantic-Wmissing原型-Wstrict原型-Wmissing声明-Wold样式定义-Wdeclaration after语句

我知道这是(不必要的)严格的,但我想用艰苦的方式学习C,真正理解它的来龙去脉。我认为像警告这样的东西对这很有用


编辑:我确实读过这个问题,但我没有真正理解答案。它还省略了关于方法原型的问题。

那么,您应该避免使用
#include
来包含.c文件。
.c
文件应该单独编译(使用
.h
文件中的通用定义,两者都包括),然后将编译后的对象链接在一起

这两个警告是假的,没有代码问题。您可以通过添加原型来抑制警告(只需复制第11行,但在末尾添加一个
)。第二个也一样

错误:
server->host=host是非法的。数组在C中是二等公民,不能使用
=
操作符复制它们。您需要进入
memcpy(&server->host,&host,sizeof server->host),或
strcpy(服务器->主机,主机)


我认为让您的C程序执行
getconf
并查看它得到了什么,这太过分了;相反,查看
getconf
将返回给您的最大值是多少。

在这种情况下,询问
getconf
可能返回多少真的有意义吗?这只是为了在给定的服务器上存储和传递。很好的一点,他应该动态分配足够的资源来存储调用方提供的任何内容谢谢您的快速回答!我将阅读
链接
,因为这似乎是主要问题之一关于主机值分配,是否有一种方法可以直接“传递”值而不必重新创建/复制参数值我在声明我的方法之前添加了
prototype
,它确实删除了警告@MattMcNabb-我还想知道你是否可以进一步阐述你的最后评论?在我的示例中,C89中的动态分配是如何工作的?