2015-12-08 4 views
-2

Я дал этот кусок кода:пытается исправить ошибку - ошибка сегментации 11

#include <stdio.h> 
#include <math.h> 

struct polar_coordinate{ 
    double theta; 
    double r; 
}; 
struct polar_coordinate * polar(double x, double y); 

int main(void){ 
    double x = 2.0; 
    double y = 3.0; 
    struct polar_coordinate * pci; 

    pci = polar(x,y); 
    printf("The coordinate x = %.1f and y = %.1f is 
    in polar coordinates theta = %.2f and r = %.2f\n ",x,y,pci->theta,pci->r); 
    } 

struct polar_coordinate * polar(double x, double y){ 
    struct polar_coordinate pc; 
    pc.r = sqrt(x*x + y*y); 
    pc.theta = atan2(y,x); 
    return &pc; 
} 

Я тогда сказал, что структура polar_coordinate * полярная функция есть ошибка, что я должен исправить. Я пытался делать это с помощью:

struct polar_coordinate * polar(double x, double y){ 
    struct polar_coordinate * pc; 
    pc->r = sqrt(x*x + y*y); 
    pc->theta = atan2(y,x); 
    return pc; 
} 

код может затем компилировать, но если я пытаюсь запустить я получаю ошибку сегментации 11. Но я не могу видеть то, что должно быть не так.

+1

'polar()' возвращает указатель на локальную переменную, срок жизни которой заканчивается после возвращения функции. Увеличьте свои предупреждения о компиляторе. –

+2

Возможный дубликат [возврат локальной переменной из функции в C] (http://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c) – dandan78

ответ

1

Вы пытаетесь вернуть локальную переменную, чтобы получить ошибку сегментации, поэтому распределите динамическую память с помощью malloc или calloc и free после использования.

рабочий код с изменениями ....

#include <stdio.h> 
#include <math.h> 

struct polar_coordinate{ 
    double theta; 
    double r; 
}; 
struct polar_coordinate * polar(double x, double y); 

int main(void){ 
    double x = 2.0; 
    double y = 3.0; 
    struct polar_coordinate * pci; 

    pci = polar(x, y); 
    printf("The coordinate x = %.1f and y = %.1f is in polar coordinates theta = %.2f and r = %.2f\n ",x,y,pci->theta,pci->r); 

    if (pci) 
     free(pci); //free memory after use 
} 

struct polar_coordinate * polar(double x, double y){ 
    struct polar_coordinate *pc = malloc(sizeof (struct polar_coordinate)); //Dynamic memory allocation 

    pc->r = sqrt(x*x + y*y); 
    pc->theta = atan2(y, x); 
    return pc; 
} 
0

В этой функции

struct polar_coordinate * polar(double x, double y){ 
    struct polar_coordinate pc; 
    pc.r = sqrt(x*x + y*y); 
    pc.theta = atan2(y,x); 
    return &pc; 
} 

Вы возвращаете адрес локальной переменной, которая будет разрушена, когда функция возвращает. А потом в main() вы пытаетесь получить к нему доступ

pc.r = sqrt(x*x + y*y); 
pc.theta = atan2(y,x); 
+0

Но как насчет того, когда я использую переписанная функция? – Linda

+0

В перезаписанной версии вы указали указатель, но не указали ни на что. Вам либо нужно быть 'malloc()' некоторая память внутри функции (и 'free() после ее использования), либо передать в адрес структуры' polar_coordinate' для инициализации функции. – TripeHound

0

В функции struct polar_coordinate * polar(double x, double y) вы возвращаете локальный экземпляр polar_coordinate, который будет уничтожен в конце области видимости функции.

Перед возвратом вам необходимо выделить возвращаемую переменную.

0

Вы возвращаете указатель на локальную переменную, которая выходит за рамки, когда функция возвращает. Но ваше исправление вызывает ошибку сегментации, потому что вы используете неинициализированный указатель . Вот два способа борьбы с ним (без прохождения дополнительного аргумента)

struct polar_coordinate *polar(double x, double y){ 
    struct polar_coordinate * pc; 
    pc = malloc(sizeof (struct polar_coordinate)); 
    if (pc == NULL) 
     exit(1); 
    pc->r = sqrt(x*x + y*y); 
    pc->theta = atan2(y,x); 
    return pc; 
} 

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

Другой способ - использовать статическую локальную переменную.

struct polar_coordinate *polar(double x, double y){ 
    static struct polar_coordinate pc; 
    pc.r = sqrt(x*x + y*y); 
    pc.theta = atan2(y,x); 
    return &pc; 
} 

Недостатком этого способа является то, что последующие вызовы функции перезаписи struct.

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