我有一个字符串,为此我分配内存。之后,我将这个字符串传递给另一个函数,然后从第二个函数传递给第三个函数。问题是,在tird函数完成后,我可以访问/使用变量。但在第二个函数完成后,我无法在第一个函数中访问它的值。所以显然我做错事,但我不是什么。 有人可以帮我吗? 当然,如果任何人有更好的想法,我该如何做我想做的,我也会很感激。 我的代码到目前为止:什么是分配和传递字符串的正确方法?
#define MAX_SIZE 100
void Func1()
{
char *Test = NULL;
Test = (char *)malloc(MAX_SIZE*sizeof(char));
if (Test == NULL)
{
return;
}
Func2(Test);
if (Test!= NULL) free(Test);
}
void Func2(char *string)
{
Func3(&string);
}
void Func3(char **string)
{
if (Len > MAX_SZIE)
{
char *tmp = NULL;
tmp = (char *)realloc(*string, Len + 1);
if (!tmp)
{
return;
}
*string = tmp;
memset(*string, 0, sizeof(*string));
}
memcpy(*string, SomeOtherString, Len);
free(SomeOtherString);
}
在此先感谢!
更新: 更新的功能,与目前的代码,我现在:
bool __stdcall Function(DataToSendBack *DataArray)
{
char *Result = NULL;
char InString[ MAX_SIZE ] = { 0 };
int DataLen = 0;
bool bRetVal = false;
__try
{
Result = (char *)malloc(MAX_SIZE);
if (Result == NULL)
{
__leave;
}
memset(InString, 0, sizeof(InString));
memset(Result, 0, sizeof(Result));
memcpy(InString, DataArray->StringIn, strlen(DataArray->StringIn));
Result = GetInfo(InString, Result, &DataLen);
if (Result == NULL)
{
MessageBoxA(NULL,"error",NULL,NULL);
__leave;
}
if (strlen(ErrorMsg) > 0) strcpy(DataArray->ErrorMessage, ErrorMsg);
if (DataArray->RequiredSize < DataLen)
{
DataArray->RequiredSize = DataLen;
strcpy(DataArray->ErrorMessage, ErrorMsg);
__leave;
}
DataArray->Result = _strdup(Result);
bRetVal = true;
}
__finally
{
if (Result != NULL) free(Result);
}
return bRetVal;
}
char * GetInfo(char *String, char *Result, int *DataLen)
{
bool bRetVal = false;
__try
{
if (DoStuff(String, &Result, DataLen))
{
bRetVal = true;
}
}
__finally
{
// free other things
}
return Result;
}
bool DoStuff(char *MyString, char **Result, int *DataLen)
{
__try
{
//Call function which returns dwsize
*DataLen = dwSize * 2;
OtherString = SomFunction();
if (strlen(OtherString) > MAX_SIZE)
{
char *tmp = NULL;
tmp = (char *)realloc(*Result, strlen(OtherString));
if (!tmp)
{
__leave;
}
*Result = tmp;
memset(*Result, 0, sizeof(*Result));
}
memcpy(*Result, OtherString, strlen(OtherString));
free(OtherString);
bretVal = true;
}
__finally
{
// free other things
}
return bretVal;
}
不要在C中投入'malloc'。 – crashmstr 2014-11-24 20:43:36
'if(Result == NULL)'...其中是'Result'声明? – abelenky 2014-11-24 20:43:38
对不起,效果测试。 – kampi 2014-11-24 20:44:19