VC6为什么会在字符指针赋值的时候报错呢?
void Copy(char *from,char *to)
{
for (;*from != '\0'; from++,to++)
*to = *from;
*to='\0';
}
函数原形如上,但是在*to = *from的时候,报内存错误,我实在是找不到这个错在哪儿!!!!
问题点数:20、回复次数:11Top
1 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-11-10 11:21:45 得分 15
调用copy前,你是不是这样定义两个指针?
char *p;
char *q;
或者
char *p="sldjfldf";
char *q="dlsjfld";
然后用copy(q, p);调用copy?
第一种情况,p没有分配有意义的空间;第二种情况,字符串常量是不能被修改的。Top
2 楼goodluckyxl(被人遗忘的狗)回复于 2005-11-10 11:32:23 得分 5
内存越界或者非法操作
把所有程序贴出来看
尤其你是你to的内存申请过程Top
3 楼NETFUNNER(.NETFUNNER)回复于 2005-11-10 11:36:18 得分 0
megaboy(飞天御剑流之杀神一刀斩):我是用的第二种方式调用的,但是,我觉得p指针只是指向这个字符串的第一个字节的地址,根据指针的后移,是可以改变这个指针所指的内容的!不知道理解是否正确!
我在别的程序中碰到了一个类似的问题,因此翻看了谭浩强的书,发现236页就是我写的那样,呵呵,莫非是VC6有别的特性?Top
4 楼goodluckyxl(被人遗忘的狗)回复于 2005-11-10 11:40:51 得分 0
char *q="dlsjfld"; //这种孵值q指向区域是一块常量区 不可修改
//写操作当然有问题Top
5 楼lzp229(只想飞)(卡卡)回复于 2005-11-10 11:44:45 得分 0
又是修改常量,当然出问题了。Top
6 楼NETFUNNER(.NETFUNNER)回复于 2005-11-10 11:56:36 得分 0
以防万一,我把老谭书上写的例子搬上来了,呵呵,236页《C语言程序设计》
void Copy(char *from,char *to)
{
for (;*from != '\0'; from++,to++)
*to = *from;
*to='\0';
}
int main()
{
char *a = "I am a teacher.";
char *b = "You are a student.";
printf("string a = %s\nstring b = %s\n",a,b);
Copy(a,b);
printf("string a = %s\nstring b = %s",a,b);
return 0;
}Top
7 楼goodluckyxl(被人遗忘的狗)回复于 2005-11-10 11:58:08 得分 0
void Copy(char *from,char *to)
{
for (;*from != '\0'; from++,to++)
*to = *from;
*to='\0';
}
int main()
{
char a[] = "I am a teacher."; //here
char b[] = "You are a student.";
printf("string a = %s\nstring b = %s\n",a,b);
Copy(a,b);
printf("string a = %s\nstring b = %s",a,b);
return 0;
}
Top
8 楼Flood1984(峰子)回复于 2005-11-10 11:58:14 得分 0
如果没有操作系统的保护就不会有问题...Top
9 楼foochow(无聊,灌水......)回复于 2005-11-10 12:06:12 得分 0
release模式下就OK....Top
10 楼koil(邮桶)回复于 2005-11-10 12:25:06 得分 0
悬挂~?Top
11 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-11-10 12:31:06 得分 0
以防万一,我把老谭书上写的例子搬上来了,呵呵,236页《C语言程序设计》
--------------------------------------------------------------------
谭的这本书写于早期,那时候的C89对修改字符串常量的行为规定为未定义的,后来的修订版本把未定义改为禁止,而VC6的诞生,应该就是修订版本之后了。如果你用tc2.0编译,是可以通过的,因为tc2.0跟早期C89标准是同一个时代的。
谭这本书的代码很可能是用tc2.0编译的,因此可以通过。但是,从另一个侧面可见,谭当时极可能自己都没看过标准,因为不应该用一段未定义的代码作为例子。Top




