从函数调用中初始化结构

问题描述 投票:0回答:1

感觉自己像吃了疯药一样,只想在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;
}

堆栈溢出说我没有足够的细节,所以我想我必须继续输入句子。如果有任何细节能让我更清楚,请告诉我。它是为了一个基本的超级简化文件系统模拟项目。

c function pointers struct initialization
1个回答
1
投票

和C语言中的正常情况一样,函数的参数是通过值传递的。 在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);
  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.