用strcpy字符串赋值给指针:比如 char *p="asdfdfsfdsf"; p=strcpy(p,"abcd")

原题是这样的:
char *p="asfdsfds";
p=p+3;
printf("%d\n",strlen(strcpy(p,"abcd")));
我试了也是编译错误,但书上居然有答案,解释一下,行吗

我在tc2.0上面运行时没有错误的,但是还是有几个地方要注意一下strcpy函数的第一个参数要有足够的空间。因为strcpy函数是将字符串复制到第一个参数里面的。如果这里没有错误的话程序运行时能够通过的。那么可以先看一下p的空间是否足够。由于第一条语句char *p="asfdsfds"这里就相当于将p的空间开辟了8个字节,然后第二条语句是使p指向第三个字符处,那么p最后的空间还有6个字节,而strlen的第二个参数只有4个字节当然就不会出现错误了。
一楼所说的char *p="asfdsfds"是定义的常量是不正确的,常量的定义必须加关键字const,这里只是赋初值那么内存数据自然也可以改变了。
我想你运行没有通过时在vc6.0里面吧,我也试过了确实是通不过的。那是因为
vc里面对c语法的限制多一点,可能要明确指出p的大小才行(如定义成数组的形式)因为我很少用vc写程序,不过编译时没有问题的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-29
这样的的话 不会提示你语法错误,
但是 执行错误
因为
指针p指向了"asdfdfsfdsf“的内存空间,这个空间 是内存常量,是不可写的。

如果是这样就不会错了
char p[]="asdfdfsfdsf"; strcpy(p,"abcd")
char p[],的目的是开辟数组空间,赋值为'a’ 's' 'd' 'f' .....;
第2个回答  2010-08-29
先要给p开辟空间,然后才能用strcpy函数;

char *p = (char *)calloc(1, 32);
strcpy(p,"abcd");

如果使用malloc,别忘了p的末尾给它赋NULL
第3个回答  2010-08-29
看看你那本书的年代,这是老式语法了,在 K&R C 中,对 string literal 的修改是未定义的,因此当年的部分编译器允许类似这样的语法,如 LCC V3.6等。
而在 ANSI C 中,这种做法已被明令禁止,因此现在的大多数编译器干脆就把 string literal 放在只读内存,故这种对只读内存的写操作会出错(一般是执行出错)。
第4个回答  2010-08-29
这是典型的溢出问题,你要注意,指针只有四个字节,你要注意,你那个是字符串,占5个字节,所以溢出,不能直接赋值.
相似回答