在Main中动态分配一个结构数组,然后为其分配一个函数

时间:2017-03-14 06:45:12

标签: c arrays dynamic struct calloc

我正在为项目构建服务器,我需要以有序的方式存储一堆值。我一直在寻找几个小时,我还没弄明白。

我按如下方式构建了一个结构:

struct WHITEBOARD{
    int line;
    char type;
    int bytes;
    char string[1024];  
} *Server;

然后在我的main函数中,我想动态分配内存来创建一个结构数组WHITEBOARD到[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].line并从函数中分配给此堆绑定变量。我打算如下做。

char* doThing(struct whiteboard Server)
{
    (*Server)[1].line = 4;
    return;
}

能够从main中打印出新绑定的变量。

这可能是一个愚蠢的问题,但任何帮助都会很棒。谢谢!

2 个答案:

答案 0 :(得分:0)

struct WHITEBOARD{
    int line;
    char type;
    int bytes;
    char string[1024];  
} *Server;

您在全局范围内有一个名为struct WHITEBOARD的变量(指向Server的指针),因此,您无需在main内重新声明它,也不需要在函数参数内重新声明它,另请注意,您正在滥用取消引用运算符(*)来访问1中的元素(*Server)[1].line = 4;,只需使用Server[1].line = 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);
}

答案 1 :(得分:0)

简单地摆脱你发明的所有模糊语法,不要猜测语法"当你不确定如何做某事时。

  • 将结构声明和变量声明分开。
  • 不要使用全局变量。
  • 当没有明显的需要时,不要使用括号。
  • 请勿在同一表达式中取消引用同时包含*[]运算符的指针。
  • 不要施放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;
}