C 用变分函数分割故障
我已经试着调试了一个小时了,但是失败了。我有一个变量函数,set_buffer,它接收缓冲区来设置输入字符串C 用变分函数分割故障,c,C,我已经试着调试了一个小时了,但是失败了。我有一个变量函数,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
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);
}
void set_buffer(char*buf,int num_str,…){//按照提供的字符串顺序,以破坏性方式设置缓冲区。必须提供参数数量,以便函数知道在哪里停止。
size_t length=sizeof(buf)/sizeof(*buf);//strlen()失败,因为它依赖于空终止符。。。
printf(“长度:%d\n”,长度);
va_列表参数;
va_start(args,num_str);//va_start采用函数中最后一个已知参数的名称,以确定从何处开始采用可选参数
对于(int i=0,offset=0;i
我怀疑这可能与从va_列表参数中错误获取参数有关 sizeof(buf)/sizeof(*buf)
仅当buf
具有数组类型而不是指针时才有效。它将计算为常数4或8,这取决于您是在32位还是64位目标上
您需要传递一个指定可用缓冲区大小的参数
这并不完全指向崩溃,因为结果仅用于偏移
测试。(顺便说一句,这是不正确的;您应该使用length
来限制指定给snprintf
的空间)要查看出了什么问题,我们需要一个完整的、自包含的测试用例。sizeof(buf)/sizeof(*buf)
只有当buf
具有数组类型而不是指针时才有效。它将计算为常数4或8,这取决于您是在32位还是64位目标上
您需要传递一个指定可用缓冲区大小的参数
这并不完全指向崩溃,因为结果仅用于偏移
测试。(顺便说一句,这是不正确的;您应该使用length
来限制指定给snprintf
的空间)要查看出了什么问题,我们需要一个完整的、自包含的测试用例。您不能执行sizeof(buf)/sizeof(*buf)
,因为
sizeof(buf) == sizeof(char*)
sizeof(*buf) == sizeof(char)
所以你实际上是在做:sizeof(char*)/sizeof(char)
你不能做sizeof(buf)/sizeof(*buf)
,因为
sizeof(buf) == sizeof(char*)
sizeof(*buf) == sizeof(char)
所以您实际上是在做:
sizeof(char*)/sizeof(char)
您的问题是什么?为什么不提供一个完整的最小工作代码示例来重现问题?您的问题是什么?为什么不提供一个完整的最小工作代码示例来重现问题?既然我们不能使用sizeof,我如何获得函数外部的缓冲区大小()?@GeorgeNewton缓冲区大小是需要考虑的问题。无论你在哪里传递缓冲区,也要传递它的大小。如果需要,使用结构。或者硬编码一个保守的大小,这样它总是事先知道的。我不明白。所以你告诉我,当我做char*ptr=malloc(…)-除非我硬编码,否则我找不到长度/大小?@GeorgeNewton传递给malloc
的参数是大小。您的责任是保存该信息。不,系统不会以其他方式将其返回给您,至少在没有平台特定技巧的情况下。@MBlanc从技术上讲,在它不起作用的上下文中,buf
具有类型e而不是数组,例如指向数组的指针或普通指针。声明为foo(int arg[6])
的函数参数衰减为int*
。既然不能使用sizeof(),我如何获得函数外部的缓冲区大小?@GeorgeNewton缓冲区大小是需要考虑的。无论你在哪里传递缓冲区,都要传递它的大小。如果需要,使用struct
。或者硬编码一个保守的大小,这样它总是事先知道的。我不明白。所以你告诉我,那么当我做char*ptr=malloc(…)-除非我硬编码,否则我找不到长度/大小?@GeorgeNewton传递给malloc
的参数是大小。您的责任是保存该信息。不,系统不会以其他方式将其返回给您,至少在没有平台特定技巧的情况下。@MBlanc从技术上讲,在它不起作用的上下文中,buf
具有类型e而不是数组,例如指向数组的指针或普通指针。声明为foo(int arg[6])
的函数参数衰减为int*
。