2013-10-08 5 views
-2

У меня возникли проблемы с присвоением попутного указателем из структуры к функции моего кода (проще говоря) являетсяСтруктуры и функция в C

struct userCom{ 
    int x; 
    int y; 
} 

main(void){ 
    struct userCom com; 
    userComFunction(com); 
    printf("%d", com.x); 
} 

userComFunction(struct userCom *return_type){ 
    struct userCom temp; 
    temp.x = 10; 
    printf("%d", temp.x); 
    *return_type = temp; 
} 

Это напечатает

10 
11537460 

ли я проходя через указатель неправильно? Я не могу понять, почему com.x не равен 10

+1

Вам необходимо передать ссылку на указатель. Попробуйте «userComFunction (& com)» –

+1

Попробуйте включить все предупреждения при компиляции (например, gcc -Wall). Это должно указывать на проблему. – Chris

+1

Кстати, у вас отсутствуют возвращаемые типы функций. используйте опцию 'gcc -Wall'. –

ответ

3

Как указывали другие, проблема в том, что вы передаете неправильный тип аргумента userComFunction. Но реальная проблема заключается в том, что ваш компилятор не говорит вам об этом.

Начиная с C90 (это два стандарта назад), вызов функции без видимого объявления был законным, и компилятор сделал бы предположения (часто неверные) о том, как выглядит функция. Когда компилятор видит вызов userComFunction, он не видел объявления или определения для userComFunction, поэтому он не может диагностировать вашу ошибку.

Начиная с C99, вызов функции без видимого объявления является нарушением ограничения , что означает, что компилятор должен предупредить вас об этом. C99 также сбросил «неявное правило int», поэтому вы больше не можете опускать тип возвращаемого значения в объявлении функции; main должен быть объявлен с возвратом int (неvoid!) И userComFunction, так как он ничего не возвращает, должен быть void.

Вы можете либо перейти полное определение userComFunction выше определения main, или вы можете оставить определение, где она есть, и добавить «вперед» заявление:

void userComFunction(struct userCom *return_type); 

int main(void) { 
    /* ... */ 
} 

void userComFunction(struct userCom *return_type) { 
    /* ... */ 
} 

Когда вы сделаете это, компилятор что вы сообщите, что ваш звонок:

userComFunction(com); 

является неправильным. (Исправлено изменение com на &com.)

Вы также должны использовать параметры командной строки gcc, чтобы включить дополнительные предупреждения. Например:

gcc -std=c99 -pedantic -Wall -Wextra 

-std=c99 говорит соблюдение правил ISO C99. -pedantic говорит действительно обеспечивает соблюдение этих правил. -Wall и -Wextra включить дополнительные предупреждения.

+0

Я всегда удивляюсь, читая ваш ответ. Вы ничего не пропустите. Вы должны быть учителем :) –

+0

Должен также использовать '-pedantic-error' для более проверки палки? –

+1

@GrijeshChauhan: ('-pedantic-errors' превращает предупреждения, разрешенные' -pedantic' в фатальные ошибки.) Это зависит. Если у вас есть политика рассмотрения всех предупреждений как проблем, которые необходимо устранить, нет большой практической разницы между «-патентными» и «-патентными ошибками». Если в некоторых случаях вам действительно нужно написать не переносимый код, и вы действительно знаете, что делаете, '-pedantic' может предупредить вас о потенциальных проблемах, и вы сами можете решить, следует ли соответствующим образом изменить код. Для начинающих программистов, пытающихся написать переносимый код, «-специальные ошибки», вероятно, хорошая идея. –

0

Если вы хотите назначить 10 на x, то вы должны сделать это таким образом. Вот правильный код:

struct userCom{ 
int x; 
int y; 
} 
void struct userComFunction(struct userCom*); 
main(void) 
{ 
struct userCom com; 
userComFunction(&com); 
printf("%d\n", com.x); 
} 

userComFunction(struct userCom *return_type){ 
struct userCom temp; 
temp.x = 10; 
printf("%d\n", temp.x); 
return_type->x= temp.x; 
} 
Смежные вопросы