初始化C中用于soap结构函数参数的字符**字符串

初始化C中用于soap结构函数参数的字符**字符串,c,pointers,initialization,C,Pointers,Initialization,我正在使用由生成的代码,并且需要使用声明,因为如果可能的话,已经提供了声明 gSOAP生成的代码提供了以下原型: soap_call___accounts(struct soap *soap, struct _acnt *acnt, struct _resp *resp); 以及以下结构定义: struct _acnt { int sizeacnt; char **acntNum; }; 在我的调用应用程序中,我需要使用结构成员acntNum作为调用函数中acnt

我正在使用由生成的代码,并且需要使用声明,因为如果可能的话,已经提供了声明

gSOAP生成的代码提供了以下原型:

soap_call___accounts(struct soap *soap, struct _acnt *acnt, struct _resp *resp);
以及以下结构定义:

struct _acnt
{
       int sizeacnt;
       char **acntNum;
};
在我的调用应用程序中,我需要使用结构成员
acntNum
作为调用函数中
acnt
参数的一部分发送一个帐号,如“00000123”,但在使用它之前,需要对其进行初始化

char
**acntNum
是如何初始化的

char *acntNumP = malloc(strlen("00000123")+1);  
strcpy(acntNumP, "00000123");  
char ** acntNum = &acntNumP;
当然,在需要时检查
NULL
s。

有关更多信息,请参见

soap函数接受帐户数组。因此,您不仅可以为帐户“00000123”调用soap函数,还可以在一次调用中调用两个帐户[“00000123”、“00000456”)

要实现这一点,您不仅必须分配内存,还必须将size参数设置为传递的帐户数。例如,您可以执行以下操作:

struct acnt Accounts;
char *AccountToCheck = "00000123";

Accounts.sizeacnt=1;
Accounts.acntNum = malloc(1 * sizeof(*Accounts.acntNum));
Accounts.acntNum[0] = AccountToCheck;

soap_call___accounts(soap, &Accounts, &Response);

不要从
malloc()
强制转换返回值。这样做可能会隐藏代码中的错误(即未能包含
,从而导致对返回值的错误解释)。@pmg:如何将
void*
强制转换为
char*
隐藏缺少的包含?如果不包含正确的标头,则没有
void*
。在没有声明的情况下,编译器假定函数返回
int
。将
int
转换为
char*
是由于不包含标题而产生的问题。@pmg:好的,从答案中删除转换。坦白地说,我从来没有想过写糟糕的代码来捕捉错误。由于隐式转换,我希望编译器会发出警告,并且我不会将带有警告或错误的代码作为应该如何执行的示例。@LittledV:这是c早期的许多继承之一。最初的K&R语言假设所有函数返回
int
,除非另有说明,后续版本只排除了这种情况(以避免破坏现有代码)。与littleadv的回答相同的问题:不要从
malloc
中强制转换结果。Ok在阅读后更改了它