Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Main中动态分配结构数组,然后为其分配函数_C_Arrays_Dynamic_Struct_Calloc - Fatal编程技术网

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提交缺陷报告。打字错误已经纠正了,谢谢。