C语言 试图连接两个指针char,但其中一个正在改变



我正在使用树莓派pico与C.我试图采取2个不同的十进制值char然后连接它们。我正在从射频识别中获取这些十进制值。来自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

999是a的值正在变化。为什么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);

问题包括:

只有一个缓冲区

参见@Some programmer dude。

缓冲区太小

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

未定义行为(UB)

val = -val;是UBval == LLONG_MIN


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

单个缓冲选择

传入缓冲区备选项。

相关内容

  • 没有找到相关文章

最新更新