2015-09-03 3 views
-3
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main(int argc, char** argv){ 
     int xAmount = atoi(argv[1]); 
     int yAmount = atoi(argv[2]); 
     double coef[argc - 3]; 
     int i = 0; 
     for(i=0; i < argc - 3; i++){ 
       coef[i] = atof(argv[i+3]); 
     } 
     for(i=0; i < argc-3; i++){ 
       if(i == 0){ 
         printf("y = %.2f",coef[i]); 
       } 
       else { 
         printf(" + %.2fx^%d",coef[i],i); 
       } 
     } 


     return 0; 
} 

Почему этот код C возвращает ошибку сегментации? Я просмотрел другие примеры и вопросы, которые были связаны с этой же проблемой, но я не могу найти аналогичную проблему в этом коде. Что мне не хватает?Почему этот код возвращает ошибку сегментации?

+2

Вы используете отладчик? Если бы вы могли сделать обратную линию и сообщить нам, что она говорит, мы могли бы помочь вам лучше. – asdf

+0

Вы пытаетесь получить доступ к некоторой памяти, которая не существует, которая вызывает ошибку сегмента. проверьте, какой номер строки это делает, и посмотрите, что выделено и что вы получаете. Поскольку вы передаете аргумент командной строки и нет обработки ошибок, это может вызвать ошибки, когда аргументы не передаются. –

ответ

0

Единственное, что я вижу здесь, которое может вызвать segfault, это массив аргументов командной строки: argv. Вы пытаетесь получить доступ к этому массиву в нескольких частях вашего кода.

Вы передаете правильное количество команд и тип аргументов командной строки?


Возможное решение, чтобы убедиться, это не произойдет в будущем создать if в начале вашего кода, который проверяет argc, чтобы убедиться, если правильное количество аргументов, передаваемых в.

2

Это происходит потому, что вы не передаете аргумент командной строки, а функция atoi(s) возвращает segfault, когда s имеет значение null.

Вы должны вызвать функцию ./your_program_name arg1 arg2 arg3 ... и т.д.

+0

Функция 'atoi' может возвращать segfault, когда аргумент имеет значение NULL, но не является тем, что вызывает его: просто OP пытаясь получить доступ к чему-либо в 'argv', который не будет вызывать segfault. В основном это вызывает segfault: «atoi (' argv [1']) », а не это:« atoi »(argv [1]); – SirPython

+0

Я не думаю, что это правда. Я не получаю segfault, запустив программу, состоящую из 'printf ("% s. ", Argv [1]);', когда 'argv [1]' отсутствует, например. Я просто получаю '(null)'. – michaelrccurtis

+1

@SirPython В стандарте C говорится: «argv [argc] должен быть нулевым указателем». Итак, в этом случае 'argv [1]' действительно 'NULL', если никакие аргументы командной строки cmd не передаются. Таким образом, ответ технически корректен. Действительно, если вы запускаете программу в отладчике, вы должны наблюдать segv в результате вызова 'atoi'. – kaylum

Смежные вопросы