我一直试图调试这个一小时,但我失败了。我有一个可变函数set_buffer,它接受缓冲区将输入字符串设置为
void set_buffer(char *buf, int num_str, ...) { // destructively sets buffer with the strings provided, in the order they are provided. Must provide number of arguments so function knows where to stop.
size_t length = sizeof(buf) / sizeof(*buf); // strlen() fails because it depends on the null terminator...
printf("length: %d\n", length);
va_list args;
va_start(args, num_str); // va_start takes on the NAME of the last known parameter in the function to determine where to start taking in optional arguments
for (int i = 0, offset = 0; i < num_str && offset < length; ++i) {
char *str = va_arg(args, char *);
printf("length of str: %d\n", strlen(str)); // SEG FAULT ERROR
offset += snprintf(buf+offset, strlen(str)+1, "%s", str); // I must be adding too much of an offset, resulting in a seg fault
if (i != (num_str - 1)) {
//offset -= 1;
}
}
va_end(args);
}
我怀疑它可能与从va_list args中错误地获取参数有关。
答案 0 :(得分:3)
sizeof(buf) / sizeof(*buf)
具有数组类型而不是指针时, buf
才有效。根据您是在32位还是64位目标上,它将评估为常数4或8。
您需要传递一个指定可用缓冲区大小的参数。
这并不完全指向崩溃,因为结果仅用于offset < length
测试。 (顺便说一下,这是不正确的;您应该使用length
来限制指定为snprintf
的空间。)为了查看出现了什么问题,我们需要一个完整的,独立的测试用例。
答案 1 :(得分:3)
你不能sizeof(buf) / sizeof(*buf)
,因为
sizeof(buf) == sizeof(char*)
sizeof(*buf) == sizeof(char)
所以你实际上在做:sizeof(char*)/sizeof(char)