试图连接两个指针字符,但其中一个正在改变

trying to concat two pointer char but one of them is changing

我在 C 中使用 Raspberry Pi pico。我试图将 2 个不同的十进制值转换为 char,然后将它们连接起来。我正在从 rfid 中获取这些十进制值。 rfid传过来的值一开始不是十进制的,我通过处理把这些值转成十进制的。

char *a;
char *b;
a = lltoa(decimal_2, 10);
printf(a);
b = lltoa(decimal, 10);
printf(b);
int newSize = strlen(a) + strlen(b) + 1;
char *newBuffer = (char *)malloc(newSize);
printf("\n");
strcpy(newBuffer, a);
strcat(newBuffer, b);
printf(newBuffer);

输出为:

999210803000150
150210803000150

a的值999正在变化。为什么 char *a 正在改变?

这是我的 lltoa 函数(我从堆栈溢出中获取):


char *lltoa(long long val, int base)
{

    static char buf[64] = {0};

    int i = 62;
    int sign = (val < 0);
    if (sign)
        val = -val;

    if (val == 0)
        return "0";

    for (; val && i; --i, val /= base)
    {
        buf[i] = "0123456789abcdef"[val % base];
    }

    if (sign)
    {
        buf[i--] = '-';
    }
    return &buf[i + 1];
}

lltoa 函数中你有:

static char buf[64] = {0};

当您将局部变量定义为 static 时,这意味着只有 一个 变量的单个实例,在函数的所有调用之间共享。

因此,当您调用 lltoa(decimal_2, 10) 时,buf 的内容以一种方式设置。然后在第二次调用 lltoa(decimal, 10) 中覆盖 buf.

的内容

并且由于您只有一个 buf,指针 ab 都将指向这个 buf.

由于您希望能够处理不同的基数,因此您不能像我建议的那样使用标准 snprintf,因此我的建议是您传递一个指向足够大的缓冲区的指针作为参数:

char *lltoa(long long val, int base, char *buf, size_t buflen);

问题包括:

只有一个缓冲区

参见

缓冲区太小

val == LLONG_MINbase == 2 时,预期输出需要大小为 66 的缓冲区。

未定义的行为 (UB)

val = -val; 是 UB val == LLONG_MIN.


而不是 OP 的 这是我的 lltoa 函数(我从堆栈溢出中获取)

单缓冲区alternative

已传入缓冲区 alternative