从函数调用初始化结构

红色豆子和大米

感觉就像我正在服用疯狂的药丸只是试图做我能用 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 时,它​​似乎在以前的版本中,我能够将字符串传递到字符串函数中,为其分配值,而不是将其用作返回值,并且仍然在函数的另一侧结束带有更新的字符串。

内特·埃尔德里奇

在 C 中是正常的,函数的参数是按值传递的。所谓的对象iNodeinitializeInode是局部的作用,并改变它在程序中的任何其他对象没有影响。如果您希望函数修改调用者本地的对象,则必须向它传递一个指针,并取消引用该指针以获取调用者的对象。

所以你可能想要的是:

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);
  // ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章