Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用变分函数分割故障_C - Fatal编程技术网

C 用变分函数分割故障

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

我已经试着调试了一个小时了,但是失败了。我有一个变量函数,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);
}
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*