c - 从 C 中的函数返回字符串指针

标签 c

这是我的代码:

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/

相关文章:

c - 调用 free() 后,内存 malloc() 到 mmap() 是否立即返回给操作系统?

c - 为什么异或 c 中的字符串给我垃圾值?

c - 如何从使用 gtk 回调调用的函数返回值?

c - 如何通过重定向接受命令行参数

c - C中的二维字符数组初始化

c - 二维数组中的总线错误

c - 将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换

c - C 中循环队列的打印

c - 要编写健壮的 C 程序,如何避免过多不同的 free() 组合?

c - 结构体中取消引用指针的错误