我在C中尝试使用指针和数组声明,我看到的结果对我来说没有意义。考虑将二进制转换为base 64的函数:
char *bin2b64Str(char *binStr) {
char finalb64str[256];
char *paddedBin;
int i, r, t, loops;
char buffer[] = { '0', '0', '0', '0', '0', '0', '\0' };
int count = 0;
r = 6 - strlen(binStr) % 6;
if (r != 6) {
loops = (int)strlen(binStr) / 6 + 1;
paddedBin = (char*)malloc(((strlen(binStr) + r) + 1) * sizeof(char));
memmove(paddedBin, &buffer[6 - r], r);
memmove(&paddedBin[r], binStr, strlen(binStr) + 1);
}else{
loops = (int) strlen(binStr) / 6;
paddedBin = (char*)malloc(((strlen(binStr)) + 1) * sizeof(char));
memmove(paddedBin, binStr, strlen(binStr) + 1);
}
char b64str[strlen(binStr) + r + 1];
for (i = 0; i < loops; i++) {
char sextet[7];
++count;
if (count != loops) {
memcpy(sextet, &paddedBin[6 * i], 6);
sextet[6] = '\0';
} else {
memcpy(sextet, &paddedBin[6 * i], 7);
sextet[6] = '\0';
}
b64str[i] = bin2b64Char(sextet);
}
memcpy(finalb64str, b64str, loops);
finalb64str[loops] = '\0';
return finalb64str;
}
这段代码对我来说很好,但如果我改为将第一行改为:
char *finalb64str
并将上一个memcpy行替换为:
finalb64str = b64str;
它悲惨地失败了!我根本不明白。为什么会这样?我一直在研究关于指针和数组的所有内容,但我发现的任何内容似乎都没有为我解答。
答案 0 :(得分:0)
char b64str[strlen(binStr)+r + 1];
是在函数本地的堆栈上分配的数组,函数返回时对它的任何引用都是无效的。
当你写
finalb64str = b64str;
最后您只是将局部变量分配给本地声明的数组,返回的地址将无效。
为了使b64str在外部可见,最简单的方法是将malloc存储起来然后将指针返回给它。
char* b64str = malloc(strlen(binStr)+r + 1);
...
return b64str;