我在此函数中遇到段故障错误。有人可以告诉为什么吗?

时间:2019-10-16 18:06:54

标签: c

此功能出现段错误错误。有人可以告诉原因吗?

/* Looks for an addition symbol "+" surrounded by two numbers, e.g. "5+6"
   and, if found, adds the two numbers and replaces the addition subexpression 
   with the result ("(5+6)*8" becomes "(11)*8")--remember, you don't have
   to worry about associativity! */
if (buffer[i] == '+') {
    for (startOffset = i;
         startOffset - 1 >= 0 && isNumeric(buffer[startOffset - 1]);
         --startOffset)
        ; // empty loop body
    if (startOffset == i) // For further processing
        continue;

    for (remainderOffset = i;
         remainderOffset + 1 < bufferlen && isNumeric(buffer[remainderOffset + 1]);
         ++remainderOffset)
        ; // empty loop body
    if (remainderOffset == i)
        continue;

    strncpy(operand, &buffer[startOffset], i - startOffset);
    operand[i - startOffset] = '\0';
    string2int(value1, operand);

    strncpy(operand, &buffer[remainderOffset], remainderOffset - i);
    operand[remainderOffset - i] = '\0';
    string2int(value2, operand);

    sum = value1 + value2;
    sprint(operand, "%d", sum);

    operlength = strlen(operand);
    strncpy(&buffer[startOffset], operand, operlength);
    strcpy(&buffer[operlength], &buffer[remainderOffset + 1]);

    bufferlen = bufferlen - (remainderOffset - startOffset + 1) + operlength;
}

1 个答案:

答案 0 :(得分:0)

使用gdb中的调试器标志编译程序,例如cc -g“程序名”。如果您有命令行参数,请对该程序执行gdb --args progname arg2 ...

它将把您的程序加载到带有编号行的CLI实用程序中。例如,输入“ break 32”,它将监视该行上的变量。无论如何,一旦使用调试器符号编译并加载了它,请键入“ run”以启动程序。如果未设置断点或其他任何时髦的内容,它将触发SEGV,并准确告诉您是哪一行代码触发了它。至少运行调试器3次,以确保segv错误是由同一行代码触发的。然后检查您的内存边界(您的数组索引是否在分配的地址空间之外?您是否正在遍历...尝试插入一条printf行,该行打印出要使用的数组地址和偏移量,以确保边界不会偏斜;附带说明,使用gb调试器与gdb调试器结合使用,并每次在CLI上键入“ step”以逐步执行每个步骤,您也可以在每个步骤的“ info locals”中键入执行信息,这将告诉您变量堆栈空间中的值,即每一步的索引变量值。作为手动插入printf行的替代方法,我不是专业专家。似乎继续在第9行上尚无定论。祝你好运!