#c #segmentation-fault #scanf
#c #ошибка сегментации #scanf
Вопрос:
РАСКРЫТИЕ ИНФОРМАЦИИ: Это домашнее задание.
Приведенный ниже код предназначен для чтения командного файла, отформатированного следующим образом:
ADD 6 6 5
ADDTERM 0 1 1
MULTIPLY 2 40
и вызовите соответствующую команду, используя заданные параметры. По какой-то причине, хотя ADD и ADDTERM работают должным образом, я получаю ошибку segfault при чтении строки умножения.
int arg_1 = 0, arg_2 = 0, arg_3 = 0;
while(fscanf(commands, "%s", command) != EOF)
{
if(strcmp(command, "ADDTERM") == 0)
{
/*The following line runs fine!*/
fscanf(commands, "%d %d %d",
amp;arg_1, amp;arg_2, amp;arg_3);
printf("ADDTERM, Poly: %d, Coeff: %d, Exp: %dn",
arg_1, arg_2, arg_3);
if(polys[arg_1] == NULL)
{polys[arg_1] = CreatePolynomial();}
AddTermToPoly(polys[arg_1], arg_2, arg_3);
}
else if(strcmp(command, "MULTIPLY") == 0)
{
/*The following line results in a segfault*/
fscanf(commands, "%d %d", amp;arg_1, amp;arg_2);
printf("MULTIPLY, Poly: %d, Multiplier: %dn",
arg_1, arg_2);
MultiplyPoly(polys[arg_1], arg_2);
}
/*...*/
}
Это также проблема только на Linux-сервере моей школы. На моем домашнем компьютере все работает просто отлично, используя «gcc версии 4.4.5 (Ubuntu / Linaro 4.4.4-14ubuntu5)», тогда как в моей школе используется «gcc версии 4.1.2 20080704 (Red Hat 4.1.2-48)»
Есть идеи, почему это может быть? Мы ценим вашу помощь!
Комментарии:
1. Каково точное значение
commands
строки при выполнении кода?2. commands — это не строка, а * ФАЙЛ. Разве это не так, как должно быть?
3. всегда помогает, если вы можете опубликовать минимальную программу, которая позволит другим воспроизвести вашу ошибку.
4. возможно, что что-то ранее в программе повреждает память, вы пробовали повторный запуск с файлом, который содержит только строку умножения?
5. Каков размер строки «command»? Возможно, вы забыли оставить пробел для »
Ответ №1:
Вам нужно оставить место для нулевого окончания » в вашей строке. Вы были в порядке с ADDTERM, потому что в нем на 1 букву меньше, чем в MULTIPLY.