C 在Main中动态分配结构数组,然后为其分配函数
我正在为一个项目构建一个服务器,我需要以有序的方式存储一组值。我已经找了好几个小时了,我还不知道怎么找 我构建了一个结构,如下所示:C 在Main中动态分配结构数组,然后为其分配函数,c,arrays,dynamic,struct,calloc,C,Arrays,Dynamic,Struct,Calloc,我正在为一个项目构建一个服务器,我需要以有序的方式存储一组值。我已经找了好几个小时了,我还不知道怎么找 我构建了一个结构,如下所示: struct WHITEBOARD{ int line; char type; int bytes; char string[1024]; } *Server; 然后在我的主函数中,我想动态分配内存,创建一个结构白板数组,大小为[argv[1]](最终)。我想使用calloc,在我的研究中,我发现了以下几点: void mai
struct WHITEBOARD{
int line;
char type;
int bytes;
char string[1024];
} *Server;
然后在我的主函数中,我想动态分配内存,创建一个结构白板数组,大小为[argv[1]](最终)。我想使用calloc,在我的研究中,我发现了以下几点:
void main()
{
struct whiteboard (*Server) = (struct whiteboard*) calloc(10, sizeof(*Server));
(*Server).line = 2;
printf("Test: %d\n",(*Server).line);
}
这是可行的,但我似乎无法找到如何将服务器转换为结构数组,以便我可以引用(*Server)[1]。行
并从函数中分配给此堆绑定变量。我打算这样做
char* doThing(struct whiteboard Server)
{
(*Server)[1].line = 4;
return;
}
并且能够从main打印新绑定的变量
这可能是一个愚蠢的问题,但任何帮助都会很棒。谢谢
struct WHITEBOARD{
int line;
char type;
int bytes;
char string[1024];
} *Server;
您在全局范围内有一个名为Server
的变量(指向struct WHITEBOARD
),因此,您不需要在main
内或在函数参数内重新声明它,还请注意,您误用了解引用操作符(*
)来访问(*Server)[1]中的元素1
.line=4代码>只需使用服务器[1]。行=4代码>
void doThing(void) /* Changed, you promise to return a pointer to char but you return nothing */
{
Server[1].line = 4;
}
int main(void) /* void main is not a valid signature */
{
Server = calloc(10, sizeof(*Server)); /* Don't cast calloc */
Server[1].line = 2;
doThing();
printf("Test: %d\n", Server[1].line);
free(Server);
}
简单地摆脱你发明的所有晦涩难懂的语法,当你不确定如何做某事时,不要“猜测语法”
- 保持结构声明和变量声明分开
- 不要使用全局变量
- 当没有明显的必要时,不要使用括号
- 不要在同一表达式中同时使用
*
和[]
运算符取消引用指针
- 不要强制转换calloc的结果
- 不要编写返回类型然后什么也不返回的函数
- 托管系统上main()的签名是
int main(void)
- 始终释放()分配的内存
例如:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int line;
char type;
int bytes;
char string[1024];
} whiteboard_t;
void do_thing (whiteboard_t* server)
{
server[1].line = 4;
}
int main (void)
{
int n = 10;
whiteboard_t* server = calloc(n, sizeof(whiteboard_t));
server[0].line = 2;
printf("Test: %d\n",server[0].line);
do_thing(server);
printf("Test: %d\n",server[1].line);
free(server);
return 0;
}
#包括
#包括
类型定义结构
{
内线;
煤焦类型;
整数字节;
字符字符串[1024];
}白板;
无效操作(白板服务器)
{
服务器[1]。行=4;
}
内部主(空)
{
int n=10;
whiteboard_t*server=calloc(n,sizeof(whiteboard_t));
服务器[0]。行=2;
printf(“测试:%d\n”,服务器[0]。行);
做事(服务器);
printf(“测试:%d\n”,服务器[1]。行);
免费(服务器);
返回0;
}
。此代码甚至不编译….(*Server)[1]。行
-->服务器[1]。行
…还有什么?对不起,结构和main()应该一起编译。然而,该功能毫无意义。这是我想做的一种伪代码。\u t
类型后缀由POSIX保留,似乎OP想要一个10
元素的数组,而不是一个10*10元素的数组,使用calloc(n,sizeof(whiteboard\u t))代码>而不是calloc(n,sizeof(whiteboard_t[n])代码>@KeineLust问题是关于C而不是POSIX的。POSIX禁止后缀是POSIX标准中的一个设计缺陷,我对此毫不关心。C标准积极鼓励对typedef使用\t
。如果您愿意,请向POSIX提交缺陷报告。打字错误已经纠正了,谢谢。