一个C程序,,郁闷了我,求救!

图片说明
图片说明
这是一个复制字符串的C程序,,这样写编译,连接,运行都没问题。但是我改成下面就有问题了:
图片说明
图片说明
图片说明
这样编译连接都没错,,就是运行时出了问题,,也得不到结果。怎么回事??

按理说两个程序都不对,第一个能执行很侥幸
目标的那个数组不能指向数组常量
应该这么写:
p2 = new string[100];
char str[] = "you love me"
strcpy(p2, str);

1.首先copy_s函数申名的位置不正确!程序员基本上没有这么申名函数的!
2.你没弄清楚内存是怎么分配空间给字符串的
char* p1 = "i love you"这句话指的是p1指向一个常量字符串 i love you,何谓常量字符串?不可更改也!也就是说你只能读取这个字符串,但不能向这个字符串的位置在写入任何可变更任何字符!
char b[] = "you love me"指的是你在栈上申请了一块内存用于存放you love me,这块内存是可修改的,也就是你可以存入其它的字符串,前提是新的字符串长度要小于 you love me,因为你之前只申请了这么多,
你想存多点就越办了,程序就崩溃了!
所以你第一个程序使用copy_s能将p1指向的字符串复制到p2的位置(p2指向了b),第二个程序中p1,p2都指向常量字符串,p2所指的内存位置是不可更改的,所以将p1指向的字符中复制到p2所指的位置就会崩溃!
明白吗?

你试图修改字符串常量,所以报错了。

const char *p1="aaaaa"这样声明的字符串pq的内容是不能被改变的,这样p1指向了常量池中的一个地址,里面有字符串里内容,但是p1本身没有空间,所以不能被修改

三楼回复的超精辟,很少人会考虑到野指针的出现!