求大家伙儿解答此题,指针与字符串,不知道哪错了

求大家解答此题,指针与字符串,不知道哪错了
#include <stdio.h>
 

 void uppercase(char *str)
 {

while(*str!='\0') 
{
if((*str>='a')&&(*str<='z'))
*str-=('a'-'A');
  str++;
}

 }

int main()
{
   
  char *str1="aBcDeF";
  uppercase(str1);
printf("%s \n",str1);
  return 0;
}
这个是将字符串中的小写字母改为大写?
还有这个字符串拷贝的问题?
#include <stdio.h>

char * strcpy_str (char *strDest,const char *strSrc)

{

  // assert((strDest!=NULL)&&(strSrc!=NULL));
char *strDestCopy=strDest;

  while ((*strDest++=*strSrc++)!='\0');

  return strDestCopy;

}


void main()
{
  char *str=NULL;
  char *strdest="abcd";
  str=strcpy_str(strdest,"hello");
  printf("%s \n",str);
  
}
vc++6.0中编译通过,但运行时程序崩溃,why?
谢谢

------解决方案--------------------
char *str1="aBcDeF"; 常量字符串
------解决方案--------------------
1楼正解
char *str1="aBcDeF"和char *strdest="abcd"都是常量字符串,指针str1和strdest所指的内存是不能被改写的
------解决方案--------------------
C/C++ code
void uppercase(char *str)
{

    while(*str!='\0') 
    {
        if((*str>='a')&&(*str<='z'))
            *str-=('a'-'A');
        str++;
    }

}

int main()
{

    char str1[] = "aBcDeF";
    uppercase(str1);
    printf("%s \n",str1);
    return 0;
}

#include <stdio.h>

char * strcpy_str (char *strDest,const char *strSrc)

{

    // assert((strDest!=NULL)&&(strSrc!=NULL));
    char *strDestCopy=strDest;

    while ((*strDest++=*strSrc++)!='\0');

    return strDestCopy;

}


void main()
{
    char *str=NULL;
    char strdest[]="abcdsss";
    str=strcpy_str(strdest,"hello");
    printf("%s \n",str);

}

------解决方案--------------------
字符串常量是不能被修改的
------解决方案--------------------
#include <stdio.h>
 

 void uppercase(char *str){
char* str_temp=str;
while(*str_temp!='\0'){
if((*str_temp>='a')&&(*str_temp<='z'))
*str_temp-=('a'-'A');
str_temp++;
}

}

int main(){
//char *str1="aBcDeF";// str1 is const string,its element can't been modified.
char str1[]="aBcDeF";
uppercase(str1);
printf("%s \n",str1);
printf("a=%d, A=%d\n",'a','A');
return 0;
}
------解决方案--------------------
探讨

引用:

C/C++ code
void uppercase(char *str)
{

while(*str!='\0')
{
if((*str>='a')&amp;amp;&amp;amp;(*str<='z'))
*str-=('a'-'A');
str++;
}

}

int main()
{

char str1[] ……

……

------解决方案--------------------
在tc中可以运行
------解决方案--------------------
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写。后果自负。
------解决方案--------------------
关于常量字符串看这里