如何正确初始化作为 ANSI-C 中 RPC 自动生成结构字段的字符串

How to properly initialize a string that is a field of an autogenerated structure from RPC in ANSI-C

我正在 Ubuntu 17.04 中使用 ANSI-C 编写 RPC 客户端-服务器应用程序。在正确初始化使用 RPC 从预定义结构自动生成的字符串并将其从客户端传递到服务器时,我遇到了很大的麻烦。

这是我对结构的定义(在 RPC 中):

struct usuario{
   int codigo;
   string nombreUsuario<25>;
   string nombreReal<25>;
   string apellido1<25>;
   string apellido2<25>;
   string clave<25>;
   int num_tarjeta;
   string fechaAlta<10>;
   string fechaBaja<10>;
};

此处是远程函数定义(在 RPC 中):

program NPROG {
 version NVERS {
  string registrarse(usuario)=2;
 }=1;
}=0x20000001;

注意:我在远程调用之前初始化了所有字段和所有字符串,这些字符串就像我将在下面显示的那样,但我在这里只写一个是为了不写很长问题。

现在我的客户端有这样的东西:

void
nprog_1(char *host)
{
CLIENT *clnt;
char * *result_1;
usuario  register_arg;

#ifndef DEBUG
clnt = clnt_create (host, NPROG, NVERS, "tcp");
if (clnt == NULL) {
    clnt_pcreateerror (host);
    exit (1);
}
#endif  /* DEBUG */



register_arg.codigo = 0;

// In this way, Segment fault, the two functions, strcpy and strncpy
// strcpy(register_arg.nombreUsuario, "SomeName");

strncpy(register_arg.nombreUsuario, "SomeName", sizeof(register_arg.nombreUsuario));

// call failed en registro: RPC: Remote system error
// register_arg.nombreUsuario = "SomeName";

result_1 = registrarse_1(&register_arg, clnt);
if (result_1 == (char **) NULL) {
    clnt_perror (clnt, "call failed en registro");
}

#ifndef DEBUG
clnt_destroy (clnt);
#endif   /* DEBUG */
} 

我没有输入 remote/server 代码,因为我什至无法到达那里。

问题是,在为字符串生成的结构中,没有预先分配内存,这些只是悬空指针!所以你必须自己关心字符串的内存,例如你可以传递一个常量:

register_arg.nombreUsuario = "SomeName";

或者自己分配内存:

register_arg.nombreUsuario = strdup("SomeName");

那么它应该会如您所愿地工作。