char *name="Siva",*str;
for(int i=0;i<strlen(name);i++)
{
str[i]=name[i];
}
str is a pointer, but it doesn't yet point to anything.
Since you're in C++, you should be using std::string:
#include<iostream>
#include <string>
using namespace std;
int main()
{
  char *name="Siva";
  std::string str;
  for(int i=0;i<strlen(name);i++)
  {
    str += name[i];
  }
  cout<<str;
  return 0;
}
Even better, get rid of the hand-written loop:
#include <algorithm>
int main()
{
  char *name="Siva";
  std::string str;
  std::copy (name, name + strlen (name), std::back_inserter (str));
  cout<<str;
  return 0;
}
Better even still, there's no reason in this particular example why you need to do any of that at all:
char* name = "Silva";
std::string str = name;
cout << str;
By the way, string literals in C++ are inherently const:
const char* name = "Silva";
If you really must use a char*, first I would strongly question why, and then I would tell you to do this:
int main()
{
  const char *name="Siva";
  char* str = new char [strlen (name)+1]; // +1 for the null terminator
  strcpy (name, str);
  cout << str;
  delete [] str;
  return 0;
}
I would even more strongly question your need to copy it byte-by-byte:
int main()
{
  const char *name="Siva";
  char* str = new char [strlen (name)+1]; // +1 for the null terminator
  for (size_t i = 0; i < strlen (name); ++i )
    str [i] = name [i];
  str [strlen (name)] = '\0';
  cout << str;
  delete [] str;
  return 0;
}