【问题标题】:modifying a function parameter (a pointer) from within the application从应用程序中修改函数参数(指针)
【发布时间】:2009-06-15 13:16:38
【问题描述】:

这是一个基于 Win32 的 C 代码的问题。 在我的一个函数中,我有以下代码:

void SeparateStuff()
{
    HGLOBAL hMem;
    IStream* pStream;
    Status result;
    unsigned char* pBytes;
    DWORD size;
    FILE* fp;

    if (hMem = GlobalAlloc(GMEM_MOVEABLE, 0))
    {

        if (CreateStreamOnHGlobal(hMem, FALSE, &pStream) == S_OK)
        {
        // save the buffer to a file    
        result = Scramble(pStream);  
        pStream->Release();

        if (result == Ok)
        { 
            if (pBytes = (unsigned char *) GlobalLock(hMem))
            {
                                size = GlobalSize(hMem);
                                // pBytes has the buffer now
                                // in this case write it to a file
                                if(fp = fopen("c:\\SomeFile.bin", "wb"))
                                {
                                    fwrite(pBytes, size, 1, fp);
                                    fclose(fp);
                                }
                }
            }

        }
        else
        {
            printf("error CreateStreamOnHGlobal. Last err: %d\n",  GetLastError());
            return;
        }
    }
    else
    {
        printf("error GlobalAlloc. Last err: %d\n", GetLastError());
        return;
    }
}  

在这种情况下,将 unsigned char* 缓冲区保存到文件中。一切安好。 现在,我需要修改此代码,以便返回 unsigned char*。比如:

void SeparateStuff(unsigned char* ReturnedBytes)

在函数内部将修改 ReturnedBytes 的位置。 我尝试复制指针,我尝试复制指针内的数据。我尝试了很多不同的方法。不管我做什么,我都会在调用函数中得到垃圾或异常。 调用函数(例如 main())还必须传递给SeparateStuff() 一个无符号字符*。

我该怎么做?

谢谢!

【问题讨论】:

  • 为您使用的任何语言添加标签。我无法告诉你有多少次人们添加了非常好的标签,但是却忽略了一些非常明显的东西,比如 c 或 .net。

标签: c pointers reference


【解决方案1】:

您可以使用以下语法之一:

unsigned char* SeparateStuff(); //Returns a pointer
void SeparateStuff(unsigned char** ppBuffer); //Pointer to the output buffer

或者在 C++ 中:

void SeparateStuff(unsigned char*& pBuffer) //Reference to the output buffer

【讨论】:

  • 感谢您的回复。我尝试了这种(C)方法并在我拥有的代码中: ppBuffer = pBuffer 或 *ppBuffer = *pBuffer 两种情况返回的数据与 pBuffer 中的不同
  • @wonderer: 你需要设置 *ppBuffer = pBuffer.如果您执行 ppBuffer = pBuffer,则返回时根本没有任何变化。如果你这样做 *ppBuffer = *pBuffer,ppBuffer 将具有第一个字符的值,如果你把它作为一个指针......
  • @Markus:感谢您提供澄清。
【解决方案2】:

试试这个:

void SeparateStuff(unsigned char **handleToBuffer)
{
    ...

    if (*handleToBuffer = (unsigned char *) GlobalLock(hMem))
    {
        ...
    }
    else
    {
        return;
    }
    ...
}

请确保所有参数都已正确初始化。您还必须保证 GlobalLock 返回的内容保留在那里。

【讨论】:

    【解决方案3】:
    SeparateStuff(&ReturnedBytes);
    
    void SeparateStuff(unsigned char** ReturnedBytes)
    {
        ...
    }
    

    【讨论】:

    • 感谢您的回答。我需要保存的缓冲区通常只有几 kb,所以我认为它不适合单个无符号字符。除非我错过了什么。
    • 啊好吧 - 我误解了。我认为returnedBytes 是一个长度字段,而不是数据本身。更新了答案以更正此问题。
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2015-06-21
    • 2016-11-07
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多