我正在尝试编写一个函数,如果字符串的长度小于分配给字符缓冲区的最大大小,该函数将用一些字符填充字符串。我遇到一个"*检测到堆栈崩溃*:./test已终止"错误,该错误会暂停我的测试程序,因为我认为某个地方存在溢出,覆盖了一些受保护的内存。这似乎是一个简单的函数,但我似乎找不到错误的原因。
void pad_string2(char* buf, size_t buf_size, char* str, char* pad) {
strncpy(buf, str, buf_size);
size_t pad_size = buf_size - strlen(str);
printf("pad size: %zun", pad_size);
if (pad_size > 0) {
unsigned int i = 0;
while(i < (pad_size - 1)) {
strncpy((buf + strlen(str) + i), pad, buf_size);
i++;
}
}
buf[buf_size - 1] = ' ';
}
我认为这可能是一个逐个的问题,但测试字符串的长度似乎没有超过缓冲区的大小。
char buf[16];
printf("sizeof(buf): %zun", sizeof(buf));
pad_string2(buf, sizeof(buf), "testing", "A");
printf("strlen(testing): %zun", strlen("testing"));
printf("buf: %sn", buf);
Output
------
sizeof(buf): 16
pad size: 9
strlen(testing): 7
buf: testingAAAAAAAA
*** stack smashing detected ***: ./test terminated
Aborted
有人能伸出援手吗?
感谢
行:
strncpy((buf + strlen(str) + i), pad, buf_size);
最终会在内存上写入不应该写入的内容。buf_size
太大,不适合您尝试执行的操作。使用:
strncpy((buf + strlen(str) + i), pad, 1);