c - 指针初始化?对于特定功能

标签 c pointers initialization base64

好吧,这个问题让我有些困惑。

以下函数将字符串编码为 base 64

void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)
{
    static const unsigned char enc[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    unsigned char *cp;
    int i;

    cp = dest;
    for(i = 0; i < srclen; i += 3) 
    {
      *(cp++) = enc[((src[i + 0] >> 2))];
      *(cp++) = enc[((src[i + 0] << 4) & 0x30)
                    | ((src[i + 1] >> 4) & 0x0f)];
      *(cp++) = enc[((src[i + 1] << 2) & 0x3c)
                    | ((src[i + 2] >> 6) & 0x03)];
      *(cp++) = enc[((src[i + 2]     ) & 0x3f)];
    }
    *cp = '\0';
    while (i-- > srclen)
      *(--cp) = '=';

    return;
}

现在,在调用 Base64Enc() 的函数上我有:

unsigned char *B64Encoded;

这是我在 base 64 编码函数中传递给 unsigned char *dest 的参数。 我尝试了从 mallocs 到 NULL 到其他初始化的不同初始化。无论我做什么,我总是得到一个异常,如果我没有初始化它,那么编译器(VS2005 C 编译器)会抛出一个警告,告诉我它还没有被初始化。 如果我使用未初始化的变量运行此代码,有时它会起作用,而其他一些则不起作用。 如何初始化该指针并将其传递给函数?

最佳答案

您需要分配足够大的缓冲区来包含编码结果。要么在堆栈上分配它,就像这样:

unsigned char B64Encoded[256]; // the number here needs to be big enough to hold all possible variations of the argument

但是这种方式分配的空间太小容易造成栈缓冲区溢出。如果你在动态内存中分配它会好得多:

int cbEncodedSize = srclen * 4 / 3 + 1;  // cbEncodedSize is calculated from the length of the source string
unsigned char *B64Encoded = (unsigned char*)malloc(cbEncodedSize);

完成后不要忘记 free() 分配的缓冲区。

关于c - 指针初始化?对于特定功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1041072/

相关文章:

ruby - 当我可以继承而不使用它时,为什么我们在 ruby​​ 中使用 super?

c - c 中的奇怪结果

c - 从内核空间写入文件

c++ - 如何将相同的签名分配给具有不同签名的函数?

pointers - 当值指向另一个实例时,go 的 big.Int 基础值会发生变化

C++ 结构初始化数组

c++ - 是否允许从具有不确定值的对象进行分配?

c - 读取 SQLite header

c - 对齐 C 输出中的列

c++ - 函数将返回一个字符串,其中包含两个索引之间的部分