Указатель - это переменная, которая содержит адрес другой переменной, и это кажется вам понятным. Но то, что кажется, все еще не очень ясно, что при создании указателя компилятор не автоматически создать также переменную, чтобы указать на ...
В коде:
int *p;
int *q;
*p =10;
*q =10;
Вы определяете p
и q
как указатели на int, но к каким переменным типа int
они указывают? У них есть мусор внутри и может указывать в любом месте, поэтому при назначении 10 к тому, на что они указывают, на самом деле вы спам где-то в памяти.
В этих условиях, когда вы вызываете sum
, я ожидал бы больше ошибки памяти, чем странное значение (255
), но все может случиться с плохими указателями, даже для доступа к существующей памяти.
Правильный код:
int sum(int *a , int *b);
int main()
{
int i1, i2; //Allocate 2 int variables
int *p = &i1; //Create pointers and assign them
int *q = &i2; //the address of int vars i1 and i2
*p =10; //Initialize variables pointed by pointers with 10
*q =10;
int c = sum(p,q);
printf("%d",c);
}
int sum(int *a , int *b)
{
return((*a)+ (*b));
}
Я тестировал его здесь. Я получил 20-символов: //ideone.com/B3M43p – ameyCU
@ameyCU - это UB, чтобы установить указатель на произвольное значение, например '10', вы также могли бы получить рабочую игру packman, хотя Скорее всего, –
@GlennTeitelbaum Да, конечно, это UB. Я просто указал, что у меня есть. – ameyCU