从函数调用初始化结构

initialize struct from function call

感觉我正在服用疯狂的药丸,只是想用 C 语言做我能想象到的最简单的事情。任何帮助将不胜感激。为什么这有效?

#include <stdio.h>
#include <stdlib.h>

#define Q_LIMT 100

typedef struct servers
{
   int id;
   int num_in_Q;
   int server_status;
}SERVER;

  void initialize(SERVER *s);

  void initialize(SERVER *s)
  {
       int i=0,j=0;

       for(i=0; i<2; i++) {                  //i=0; i=1  
           s[i].id = i;                      //  0,   1 
           s[i].num_in_Q = i*i + 1;          //  1,   2  
           s[i].server_status = i+i + 2;     //  2,   4 
      } // the bracket was missing
}

 int main()
 {
    int i;
    SERVER serv[2];

    initialize(serv);

    for(i=0; i<2; i++) {
        printf("server[%d].id = %d\n", i, serv[i].id);
        printf("server[%d].num_in_Q = %d\n", i, serv[i].num_in_Q);

但这会丢弃初始化的结构?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
'''
int POINTERS_PER_INODE = 5;

struct Inode {
   int  valid;/* 0 == invalid, 1 == valid*/
   int size;
   int Blocks [5];
};

int InodeToString(char * InodeString, struct Inode iNode){
  char * blockBuffer;
  sprintf(InodeString, "%d", iNode.valid);
  int i;
  for (i = 0; i < POINTERS_PER_INODE; i++){
    blockBuffer = malloc(8);
    sprintf(blockBuffer, "%d", iNode.Blocks[i]); //no valid pointers yet
    strcat(InodeString,blockBuffer);
    free(blockBuffer);
  }
  return 0;
}

int initializeInode(struct Inode iNode){
  int i;
  for (i = 0; i < POINTERS_PER_INODE; i++){
    iNode.Blocks[i] = -1; //no valid pointers yet
  }
  iNode.valid = 0; //initialized as invalid inode
  return 0;
}

int main() {
  struct Inode iNode1;
  initializeInode(iNode1);

  char * InodeString;
  InodeString = malloc(20);
  InodeToString(InodeString, iNode1);
  printf("%s", InodeString);

  free(InodeString);
  iNode1.valid = 1;
  InodeString = malloc(20);
  InodeToString(InodeString, iNode1);
  printf("%s", InodeString);

  return 0;
}

顺便说一句,这是测试代码,因此包含的内容可能没有意义。堆栈溢出说我没有足够的细节所以我想我必须继续输入句子。让我知道是否有任何细节可以使这一点更清楚。它用于基本的超级简化文件系统模拟项目。似乎在以前的版本中,当我在函数外部初始化 inode 时,我能够将字符串传递给字符串函数,为其赋值,而不是将其用作 return 值,但仍然以另一个结束带有更新字符串的函数的一侧。

在 C 语言中,函数的参数是按值传递的。 initializeInode 中名为 iNode 的对象是该函数的本地对象,对其的更改不会影响程序中的任何其他对象。如果你想让一个函数修改调用者本地的对象,你必须传递一个指向它的指针,并取消引用该指针以获取调用者的对象。

所以你可能想要的是:

int initializeInode(struct Inode *iNode){
  int i;
  for (i = 0; i < POINTERS_PER_INODE; i++){
    iNode->Blocks[i] = -1; //no valid pointers yet
  }
  iNode->valid = 0; //initialized as invalid inode
  return 0;
}

int main() {
  struct Inode iNode1;
  initializeInode(&iNode1);
  // ...
}