C中的指针声明与有限阵列声明

时间:2017-01-19 19:03:16

标签: c arrays pointers

我在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;
它悲惨地失败了!我根本不明白。为什么会这样?我一直在研究关于指针和数组的所有内容,但我发现的任何内容似乎都没有为我解答。

1 个答案:

答案 0 :(得分:0)

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

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

当你写

finalb64str = b64str; 

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

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

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