gpt4 book ai didi

c - C 中的指针声明与有限数组声明

转载 作者:行者123 更新时间:2023-11-30 16:51:30 24 4
gpt4 key购买 nike

我正在尝试用 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;

它彻底失败了!我完全不明白。为什么会发生这种情况?我一直在研究有关指针和数组的所有内容,但我发现没有任何东西可以为我解答这个问题。

最佳答案

char b64str[strlen(binStr)+r + 1];

是在函数本地堆栈上分配的数组,函数返回时对其的任何引用都是无效的。

当你写

finalb64str = b64str; 

最后你只是将局部变量分配给本地声明的数组,返回的地址将无效。

为了使 b64str 在外部可见,最简单的方法是 malloc 存储,然后将指针返回到该存储。

char* b64str = malloc(strlen(binStr)+r + 1);
...
return b64str;

关于c - C 中的指针声明与有限数组声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com