将结构传递给函数的正确方法是什么?

时间:2014-11-07 14:59:26

标签: c struct

我有一个结构,我想传递给一个函数。因为输出总是相同的,所以我正在做出错误的事:(null)

有人可以帮助我。 谢谢!

typedef struct
{
    char * Value1;
    char * Value2;
} TESTSTRUCT, *PTESTSTRUCT;

BOOL MyFunction(PTESTSTRUCT TestStruct);
BOOL QueryData(char * String, char * Name);

int main ()
{
   TESTSTRUCT myStruct;
   ZeroMemory( &myStruct, sizeof( myStruct) );

   MyFunction( &myStruct );

   printf( "\nmyStruct.Value1    = %s", myStruct.Value1);
   printf( "\nmyStruct.Value2    = %s", myStruct.Value2 );
   if ( myStruct.Value1 != NULL ) LocalFree( myStruct.Value1);
   if ( myStruct.Value2 != NULL ) LocalFree( myStruct.Value2 );
}
BOOL MyFunction(PTESTSTRUCT TestStruct)
{
   //.....
   QueryData(TestStruct->Value1, TestStruct->Value2);
   //.....
}
QueryData(char * String, char * Name)
{
    // do some stuff
    LPTSTR szName = NULL;
    szName = ( LPTSTR )LocalAlloc( LPTR, dwData * sizeof( TCHAR ) );
    String = AllocateMemory(szName);
    LocalFree( szName );
    szName = NULL;
    // do some more work
    szName = ( LPTSTR )LocalAlloc( LPTR, dwData * sizeof( TCHAR ) );
    Name = AllocateMemory(szName);
    LocalFree( szName );
}
LPSTR AllocateMemory( LPSTR inputString )
{
LPSTR outputString = NULL;

outputString = ( LPSTR )LocalAlloc( LPTR, ( strlen( inputString ) + 1 ) * sizeof( CHAR ) );

if (outputString != NULL)
{
    lstrcpyA( outputString, inputString );
}

return outputString;
}

2 个答案:

答案 0 :(得分:3)

问题是你分配给QueryData中的指针。由于C按值传递所有参数,因此复制指针,并且只修改QueryData函数内的本地副本。

你需要通过引用模拟传递(我说“模拟”,因为C没有通过引用传递),通过传递一个指针,在你的情况下传递一个指向指针。

类似的东西:

BOOL QueryData(char ** String, char ** Name)
{
    ...
    *String = AllocateMemory(...);
    ...
    *Name = AllocateMemory(...)
    ...
}

称之为

QueryData(&TestStruct->Value1, &TestStruct->Value2);

答案 1 :(得分:1)

C中的指针按值传递:String中的NameQueryData参数是最初副本(空)指针的局部变量在来电者TestStruct中。更改QueryData中的局部变量不会更改存储在结构中的值。

您需要传递QueryData指向结构本身的指针(即QueryData(TestStruct))或指向结构中存储的两个char*值的指针(即QueryData(&TestStruct->Value1, &TestStruct->Value2)) ,以便QueryData可以改变结构本身的内容。