неинициализированные локальные переменные! - PullRequest
1 голос
/ 22 мая 2011

Вот мой код:

int main(void)
{
    int i;
    Coords** latLng;
    Quadrado* q1;
    latLng[0] = AdicionaValores(latLng[0],-23.000490,-43.346687);
    latLng[1] = AdicionaValores(latLng[1],-22.988243,-43.342224);
    q1 = AdicionaValoresQuadrado(q1,-23.000490,-43.346687,-22.988243,-43.342224);

    printf("# Connecting to database.\n");
    for(i=0;i<2;i++)
    {
    if(clientInside(q1, latLng[i]))
        printf("Dentro");
    else
        printf("Fora");
    }
    system("PAUSE");
}

Вот AdicionaValores и AdicionaValoresQuadrado:

Coords* AdicionaValores(Coords* v, double x, double y)
{
    v = (Coords*) malloc(sizeof(Coords));
    v->x = x;
    v->y = y;
    return v;
}

Quadrado* AdicionaValoresQuadrado(Quadrado* q, double x1, double y1, double x2, double y2)
{
    q = (Quadrado*) malloc(sizeof(Quadrado));
    q->x1 = x1;
    q->x2 = x2;
    q->y1 = y1;
    q->y2 = y2;
    return q;
}

он прекрасно компилируется с двумя предупреждениями, сообщающими, что latLng и q1 неинициализированы! что я должен делать ?? Маллок их на главном? помощь!

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

Вы можете объявить:

Coords *latLng[2];

для проблемы "latLng", которая не инициализируется, или malloc ее в main.

Для остальных - нет никаких причин для того, чтобы функции вообще брали указатель в качестве первого аргумента, поскольку он ничего не делает с исходным значением. Так же:

Coords* AdicionaValores(double x, double y)
{
    Coords* v = (Coords*) malloc(sizeof(Coords));
    ....
}
Quadrado* AdicionaValoresQuadrado(double x1, double y1, double x2, double y2)
{
    Quadrado* q = (Quadrado*) malloc(sizeof(Quadrado));
    ....
}

А потом просто не передавайте им первый аргумент в main.

1 голос
/ 23 мая 2011
Coords** latLng;
//...
latLng[0] = AdicionaValores(latLng[0],-23.000490,-43.346687);
latLng[1] = AdicionaValores(latLng[1],-22.988243,-43.342224);

Здесь вы объявляете указатель на указатель на структуру Coords, но продолжаете разыменовывать неинициализированный указатель в следующих двух строках. На данный момент latLng не является допустимым указателем и может иметь любое значение.

Вы вызываете неопределенное поведение. Вам нужно инициализировать latLng перед разыменованием его на основе количества подэлементов (указателей на Coord), на которые оно будет указывать. Затем вы можете продолжить инициализацию подэлементов, например так:

Coords* latLng[2];
//...
latLng[0] = // some assignment
latLng[1] = // some assignment

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

private Coords* AdicionaValores( Coords** q, double x, double y )
{
   *v = (Coords*) malloc(sizeof(Coords));
}

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

0 голосов
/ 23 мая 2011

latLng и q1 действительно неинициализированы.

Coords** latLng;
latLng[0] = …

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

Coords* latLng[2];
latLng[0] = …

После этого изменения выпо-прежнему получают предупреждения о неинициализированных переменных, но это связано с проблемой в интерфейсе AdicionaValores и AdicionaValoresQuadrado.На самом деле эти функции никогда не используют свой первый аргумент, но они требуют его, и вы передаете совершенно произвольное значение.Просто удалите первый аргумент и объявите v как локальную переменную.

Coords* AdicionaValores(double x, double y)
{
    Coords *v = malloc(sizeof(Coords));
    v->x = x;
    v->y = y;
    return v;
}

(Обратите внимание, что вам не нужно приводить возвращаемое значение malloc, и вы никогда не должны использовать приведениеесли у вас нет причины и вы понимаете почему. В производственной программе вы должны проверить, не заканчивается ли malloc нехватка памяти, но пока это нормально.) Затем в main:

Coords* latLng[2];
Quadrado* q1;
latLng[0] = AdicionaValores(-23.000490,-43.346687);
latLng[1] = AdicionaValores(-22.988243,-43.342224);
q1 = AdicionaValoresQuadrado(-23.000490,-43.346687,-22.988243,-43.342224);
...