这是我的代码:
TCHAR *sResult = (TCHAR *) calloc(16384+1, sizeof(TCHAR));
sResult = (TCHAR *) GetValueFromFile(sFilename,L"Dept",L"Names"); // #1
_tcscpy(sResult,(TCHAR *) GetValueFromFile(sFilename,L"Dept",L"Names"); // #2
功能:
TCHAR *GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames)
{
...
}
哪一个是正确的做法? #1 还是#2?
谢谢大家。 编辑#1:
我在 .cpp 文件中使用 VS2008,但实际上只是 C 代码。
我只需要在 GetValueFromFile 中打开一个文件并将返回字符串发送回来。我应该在 GVFF 中分配内存并在程序中释放它吗?
main()
{
TCHAR *sResult;
DWORD dwRetVal = GetValueFromFile(sFile,L"Dept",L"Name", &sResult);
...
free(sResult);sResult=NULL;
}
像这样吗?
DWORD GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames, TCHAR ** sValueData)
{
dwL = GetStringDataLength(…)
*sValueData = (TCHAR *) calloc(dwL+1, sizeof(TCHAR));
_tcscpy_s(sValueData,dwL,sDataFromFile);
}
最佳答案
首先,这在情况 1 中是不必要的,并且会导致问题:
TCHAR *sResult = (TCHAR *) calloc(16384+1, sizeof(TCHAR));
我不知道 16384+1
来自哪里,所以我暂时假设这是“正确的”,但您继续在下一行中将指针设置为另一个值。我的 friend ,这是内存泄漏。为什么要分配不需要的内存?
您的问题实际上可以归结为 GetValueFromFile
的实现。如果该函数返回一个指针(确实如此),那么它肯定应该是一个有效的指针,并且您负责释放它(可能。同样,取决于实现)。
除非您确实需要副本,否则无需创建副本。从您提供给我们的信息来看,这里没有“正确”或“错误”,我们需要了解 GetValueFromFile
的详细信息。
根据您的编辑:
该函数不返回任何内容。完全没有。它的签名表明它返回一个 DWORD,而不是 TCHAR*
。它显然与您的第一个示例不同,因为它将指针初始化为输出参数(第四个),但这不是您在原始示例中调用它的方式。
我现在更困惑了,但是如果函数初始化指针,那么您只需要声明(函数外部不需要内存分配)指针并输入其地址。
给定
DWORD GetValueFromFile(TCHAR *sFilename,TCHAR *sDept,TCHAR *sNames, TCHAR ** sValueData)
那么传递指针的正确方法是:
TCHAR *result;
GetValueFromFile(filename, dept, names, &result);
该函数初始化您的 result
变量以指向有效位置。 不要忘记您现在负责释放它!
关于c - 从 C 中的函数返回字符串指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9709316/