我正在实现一个环形缓冲区。但是当我使用printf
时,很多垃圾出现在我想要的之后:
char *dados1 = "XXXX";
char *dados2 = "YYYY";
char target_1[4];
char target_2[1];
RingBuffer *Buffer_em_Anel = RingBuffer_create(10);
RingBuffer_write(Buffer_em_Anel, dados1, 4);
RingBuffer_read(Buffer_em_Anel, target_1, 4);
printf("actual buffer %s \n", Buffer_em_Anel->buffer);
printf("Characters from read%s \n", target_1);//<---XXXX+lots_of_junk
在调试信息中,一切看起来都很好。
答案 0 :(得分:4)
您要打印的缓冲区只包含4个X
字符。
当您使用%s
说明符时,printf将继续打印所有字符,直到遇到NUL终结符(\0
)。
您不知道\0
将在内存中出现的位置,因此printf将继续打印,可能远远超出您的4个字节,直到它随机遇到\0
。
要打印4个字符,我会尝试:
printf("actual buffer %.4s \n", Buffer_em_Anel->buffer); // Note the 4 for width-specifier.
printf("Characters from read%.4s \n", target_1);
答案 1 :(得分:1)
C字符串是 null终止 char数组。假设您的RingBuffer_write
函数是类似memcpy的函数,则不要复制将发出字符串结尾信号的'\0'
。所以之后的垃圾,实际上直到内存中的下一个null。