char *s="abcd";
这句话在c++书的前面基础章节里介绍过,s是栈中分配的指针,它指向个内存常量"abcd",也就是说s可以改变,如s="jksl"只不过又指向了内存中另一个常量jksl",但是内存里的常量不能改变,所以*s='a'肯定出错,因为你试图更改内存常量了。
strupr(s)
这个函数定义如下:
char* strupr(char * string)
{
    char *cp;
      
    for (cp = string; *cp; ++cp) { 
        if ('a' <= *cp && *cp <= 'z') 
            *cp += 'A' - 'a'; 
    } 
    return(string);
}
这句话里有*cp += 'A' - 'a'这个,所以你试图更改内存常量,当然是非法的。那怎么更改右2个方法:
1.char s[]="abcd";数组是直接在栈中分配的,你可以放心使用*='某某' 
2.使用函数strdup复制一个字符串。
下面对这两种方法写下代码:
1.
#include <stdio.h> 
#include <string.h> 
int main(int argc, char* argv[]) 
{ 
    char s[]="abcd"; 
    printf("%s",strupr(s)); 
    return 0; 
}
2.
#include <string.h> 
#include <stdio.h> 
#include<malloc.h> 
int main(int argc, char* argv[])
  
{
  
    char* s="abcd";
  
    char* p=strdup(s); 
    printf("%s",strupr(p));
  
    free(p); 
    return 0;
  
}
所以抱歉了,我打破了你发现vc中bug的梦了。