Baali
Baali

Reputation: 83

Is it compulsory to initialize pointers in C++?

Is it compulsory to initialize t in the following code, before assigning value to t? Is the code correct?

void swap(int *x, int *y)
{
    int *t;
    *t = *x;
    *x = *y;
    *y = *t;
}

Upvotes: 5

Views: 446

Answers (7)

Mahesh
Mahesh

Reputation: 34625

int *t;
*t=*x;

t is not pointing to any valid location to be able to dereference.

is it compulsory to initialize , before assigning value to pointer t.

Yes, initializing / assigning to point to a valid memory location. Else where would it point to. It might some point to garbage and lead to undefined behavior on dereferencing.

Upvotes: 0

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361462

You don't need pointer to begin with:

void swap(int *x,int *y)
{
    int t; //not a pointer!
    t=*x;
    *x=*y;
    *y=t;
}
int a = 10, b = 20;
swap( &a, &b); //<-----------note : Needed &

--

Or maybe, you want the following swap function:

void swap(int & x,int & y) //parameters are references now!
{
    int t; //not a pointer!
    t=x;
    x=y;
    y=t;
}
int a = 10, b = 20;
swap(a,b); //<----------- Note: Not needed & anymore!

Upvotes: 9

the_dark_destructor
the_dark_destructor

Reputation: 687

You can find the right way of doing this here

#include <stdio.h>

void swap(int *i, int *j)
{
    int t;
    t = *i;
    *i = *j;
    *j = t;
}

Basically the reason has been explained to you by sharptooth but there you will find some more details and explanations about what happens in background when you do such a swap. Hope it helps to clear your ideas.

Upvotes: 1

michel-slm
michel-slm

Reputation: 9756

If you just want to make your pointer point to already-initialized data, then you don't need to initialize it. The way you do it, though, yes, you want to use one of the malloc functions to allocate enough heap space for an integer.

The proper, efficient way, to do swapping in C/C++ is

void swap(int *x, int *y) {
    int *t = x;
    x = y;
    y = t;
}

Upvotes: 1

jv42
jv42

Reputation: 8583

It's correct for a pointer.

Only references need to be initialized upon declaration (or in a constructor for instance members).

EDIT: but you got errors in your code, you shouldn't be dereferencing your parameters (ie int *ptr = otherPtr; is fine, not int *ptr = *otherPtr;)

Upvotes: 1

sharptooth
sharptooth

Reputation: 170499

That code contains undefined behavior:

int *t;
*t=*x; // where will the value be copied?

Besides that it makes no sense - you need a temporary variable to store the value, not the pointer.

int t; // not a pointer
t=*x;
*x=*y;
*y=t;

Upvotes: 5

Prasoon Saurav
Prasoon Saurav

Reputation: 92864

is the following section of code correct?

Nopes! Your code invokes Undefined behaviour because you are trying to dereference a wild pointer.

 int *t;
 *t=*x; // bad

Try this rather

 int t; // a pointer is not needed here
 t=*x; 

or this

int *t = x; // initialize the pointer

Upvotes: 8

Related Questions