好吧,这个问题让我有些困惑。
以下函数将字符串编码为 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/