此功能出现段错误错误。有人可以告诉原因吗?
/* 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;
}
答案 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行上尚无定论。祝你好运!