我有一个结构,我想传递给一个函数。因为输出总是相同的,所以我正在做出错误的事:(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;
}
答案 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
中的Name
和QueryData
参数是最初副本(空)指针的局部变量在来电者TestStruct
中。更改QueryData
中的局部变量不会更改存储在结构中的值。
您需要传递QueryData
指向结构本身的指针(即QueryData(TestStruct)
)或指向结构中存储的两个char*
值的指针(即QueryData(&TestStruct->Value1, &TestStruct->Value2)
) ,以便QueryData
可以改变结构本身的内容。