2015-07-17 2 views
1

Я пытаюсь увеличить значение в C и вернуть старое значение, и я делаю это с помощью указателя. Проблема в том, что новое значение по-прежнему равно 0, хотя я использую указатель.Увеличение содержания указателя

#include <stdio.h> 
#include <stdlib.h> 

int increment (int *mem) { 
    int tmp; 
    tmp = *mem; 
    *mem++; 
    return tmp; 
} 

int main() { 
    int a = 0; 
    printf("The old value of a is \t %d", increment(&a)); 
    printf("The new value of a is \t %d", a); 
} 

Теперь, когда я запускаю этот метод, я получаю то же значение для a, что и 0; Я ожидал 1 во втором printf. Я не знаю, что я делаю неправильно здесь.

+8

попробовать '(* MEM) ++ ', то читать о операторских старшинства – BeyelerStudios

+1

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

+0

да, вы правы – Bionix1441

ответ

9

Изменить этот

*mem++; 

к этому

(*mem)++; 

Проблема заключается в приоритете операторов. Вы можете прочитать о C Operator precedence.


Итак, что делает ваш код? Он увеличивает значение указателя, так как сначала активируется оператор ++, а затем активируется *, не имея реального эффекта.

В результате ваш код вызывает undefined behavior, так как вы получаете доступ (и в конечном итоге записываете) в недопустимую ячейку памяти, так как указатель увеличивается до того, как значение будет записано на него.

+0

Предназначен для использования версии C. Я удалил это. Не заметил вашей ссылки. – csnate

+1

IMO, вы должны упомянуть, что код OP вызывает UB. –

+0

Хорошая идея @CoolGuy, так как он изменяет значение указателя и доступ к нему, верно? Это то, что вы имеете в виду, или у вас было что-то еще в виду? Это нормально csnate. – gsamaras

5

Возможно, вы пропустили некоторые круглые скобки?

#include <stdio.h> 
#include <stdlib.h> 

int increment (int *mem) { 
    int tmp; 
    tmp = *mem; 
    (*mem)++; // problem was here. 
    return tmp; 
} 

int main(){ 
    int a = 0; 
    printf("The old value of a is \t %d", increment(&a)); 
    printf("The new value of a is \t %d", a); 
} 
+1

Скобки должны использоваться для множественного числа. Поскольку я греческий, я должен был сказать! : P Кстати, +1 для полного кода. – gsamaras

0

В дополнение к тому, что все остальные выложила о приоритете операций, если вы передаете в указатель на междунар будет увеличиваться нет никаких оснований для возвращения копию междунар через tmp. У вас будет доступ к значению в mem вне функции.

#include <stdio.h> 
#include <stdlib.h> 

void increment (int *mem) { 
    (*mem)++; 
} 

int main() { 
    int a = 0; 
    printf("The old value of a is \t %d", a); 
    increment(&a); 
    printf("The new value of a is \t %d", a); 
} 
Смежные вопросы