2013-06-23 3 views
-5

Почему это всегда возвращает мне указатель (nil) или NULL? Даже если указатель A не является указателем NULL?Возвращает указатель в функции

struct example *doSomething(struct example*, struct example*); 
struct example *pointerA; 
struct example *pointerB; 
... 
main(){ 
    ... 
    doSomething(pointerA,pointerB); 
    ... 
} 
struct example* doSomething(struct example *pointerA,struct example *pointerB) 
{ 
    ... 
    return pointerA; 
} 
+7

Для нас не достаточно кода, чтобы помочь вам. Для чего это стоит, в коде, который * есть *, 'pointerA' * - * нулевой указатель. Кроме того, немного странно скрывать вашу глобальную переменную с таким именем параметра. –

+1

OT: Это '** int ** main()' btw! – alk

+0

@alk, я бы назвал это по теме. В конце концов, вопрос помечен как C! –

ответ

0

Вот небольшой пример, который вы могли бы найти полезным

#include <stdio.h> 


struct myexample { 
    int a; 
    int b; 
}; 

typedef struct myexample example; 

example add(example *first, example *second) { 
    example retval; 
    retval.a = first->a + second->a; 
    return retval; 
} 

int main() { 
    example x1,x2,result; 
    x1.a=4; 
    x2.a=3; 
    result=add(&x1,&x2); 
    printf("%d", result.a); 
    return 0; 
} 

Обратите внимание:

  • использование & передать адреса в качестве структур параметры к функции
  • в функции использование -> использовать элемент в пределах заостренной структуры
  • использование «typedef», чтобы избежать необходимости говорить «struct myexample» везде
+0

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

+1

@nonsensical вы, вероятно, правы! Я думал, если OP так неспособен выразить проблему, то резюме некоторых основ - лучший способ пойти, для него/нее :) – Vorsprung

3

Там действительно не хватает кода в вашем вопросе, но эта линия

doSomething(pointerA,pointerB); 

не может изменить pointerA в C, независимо от того, какого типа pointerA есть. так что если вы пытались изменить его внутри функции, вам следует либо сделать

pointerA = doSomething(pointerA, pointerB); 

или передать указатель на указатель

... 
    doSomething(&pointerA, pointerB); 
... 
} 
struct example* doSomething(struct example **ppa, struct example *pb) 
{ 
    ... 
    *ppa = something; 
} 

Я думаю, что основная путаница возникает с двух точек:

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