2014-08-27 3 views
0

Эй, я пытаюсь переключить два параметра вокруг только тогда, когда параметр 1 больше параметра 2.Basic Pointer C Программирование

Что у меня до сих пор это:

#include <stdio.h> 

void ascending2(int*, int*); 

int main(void){ 
    int ptr1 = 20; 
    int ptr2 = 10; 
    printf("ptr1 = %d, ptr2 = %d", ascending2(&ptr1, &ptr2)); 
    return 0; 
} 

void ascending2(int *ptr1, int* ptr2){ 
    int *value; 
    if(*ptr1 >= *ptr2){ 
     *value = *ptr1; 
     *ptr1 = *ptr2; 
     *ptr2 = *value;} 
} 

Может кто-нибудь подскажет, где я могу ошибиться, спасибо.

+0

Итак, где ошибка? –

+0

Я не уверен, в чем проблема. – majidarif

+0

Не ошибка, но имена переменных 'ptr1' и' ptr2' в 'main()' действительно плохие. – unwind

ответ

4

Это потому, что в функции ascending2 вы объявляете value как указатель, но на самом деле не делают его точку в любом месте. Поэтому, когда вы разыгрываете это, вы разыгрываете неинициализированный указатель, который ведет к undefined behavior.

Существует два очевидных решения: либо вы делаете точку value где-то действительной, либо даже лучше объявляете ее как переменную без указателя.


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

Решение здесь, чтобы вызвать функцию по отдельности, а затем вызвать printf с ptr1 и ptr2 переменных (которые, кстати, не очень хорошо названы, поскольку они не являются на самом деле указатели).

1

value Вы объявляете указатель. Измените его на int value.

2
printf("ptr1 = %d, ptr2 = %d", ascending2(&ptr1, &ptr2)); 

здесь ascending2(..) ничего не возвращает. Необходимо изменить printf. как

ascending2(&ptr1, &ptr2); 
printf("ptr1 = %d, ptr2 = %d",ptr1,ptr2); 

И ваша функция должна быть

void ascending2(int *ptr1, int* ptr2){ 
    int value;      // change *value to value 
    if(*ptr1 >= *ptr2){ 
     value = *ptr1;   // change *value to value 
     *ptr1 = *ptr2; 
     *ptr2 = value;}   // change *value to value 
} 
1

Исправление ошибок.

#include <stdio.h> 

void ascending2(int*, int*); 

int main(void){ 
    int ptr1 = 20; 
    int ptr2 = 10; 
    ascending2(&ptr1, &ptr2); //Fix1 

    printf("ptr1 = %d, ptr2 = %d", ptr1, ptr2); 
    return 0; 
} 

void ascending2(int *ptr1, int* ptr2){ 
    int value=0; //Fix2 
    if(*ptr1 >= *ptr2){ 
     value = *ptr1; 
     *ptr1 = *ptr2; 
     *ptr2 = value;} 
} 

Fix1: Аргумент не должен быть передан printf заявление, как вы did.The функцию ascending2 также не возвращает значения. Итак, позвоните по возрастанию2 API 1 и затем распечатайте значения ptr1, ptr2. Чтобы узнать больше о printf, пожалуйста, обратитесь к приведенной ниже ссылке. http://www.cplusplus.com/reference/cstdio/printf/

fix2:

Внутри ascending2 функции нет необходимости использовать value в качестве переменной указателя. Он может быть целым. Если вы используете value в качестве указателя, то должна быть обеспечена надлежащая память.

0

Просто, чтобы добавить некоторые предложения, уже есть хорошие ответы: функция замены может быть улучшен:

void ascending2(int *ptr1, int* ptr2) 
{ 
    if(*ptr1 > *ptr2) 
    { 
    const int tmp = *ptr1; 
    *ptr1 = *ptr2; 
    *ptr2 = tmp; 
    } 
} 

Улучшение:

  • Используйте > для сравнения, нет необходимости делать ничего, если два значения равны, поэтому сравнение с использованием >= не имеет смысла.
  • Перемещена временная переменная в область, в которой она используется.
  • Переименовал его в tmp, чтобы сделать его более понятным, что он делает. «Значение» действительно является общим.
  • Сделано const, так как после назначения оно не изменяется.
  • Инициализируйте непосредственно нужное значение.
+0

Спасибо, за что стоит 'tmp'? – IamTrent

+0

@IamTrent Это обычно используемое сокращение «временного». – unwind

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