[求助]数组 和 指针, 为什么一个对一个不对呢?
/* 1 */#include <stdio.h>
void copy(char *to, char *from )
{
while((*to++ = *from++)!='\0');
}
void main()
{
char a[] = "China...";
char b[] = "Long life!";
copy(a, b);
printf("%s\n",a);
}
/* 2 */
#include <stdio.h>
void copy(char *to, char *from )
{
while((*to++ = *from++)!='\0');
}
void main()
{
char *a = "China...";
char *b = "Long life!";
copy(a, b);
printf("%s\n",a);
}
/*
为什么1对, 2 出错,在vc++ 6.0中运行。
TC中皆对。*/
搜索更多相关的解决方案:
指针
----------------解决方案--------------------------------------------------------
你可以写这样一个程序
void main()
{
char *a = "China...";
*a = 'c';
printf("%s\n",a);
}
看看能不能改变其值,由于a只是一个指针,"China..."是一个常量字符串,在内存中其值不可改变.
所以试图改变其值时程序会出错.
而为什么数组可以呢?数组有自己的空间,就是定义数组的时候编译器自动给其分配空间的,
char a[] = "China...";执行完这个语句后,编译器自动会把常量字符串拷贝到数组中,并且在后面加上'\0',
这个只是我自己的理解啦,哈哈
----------------解决方案--------------------------------------------------------
上次kaikai不是解答过了?
----------------解决方案--------------------------------------------------------
对哦,好像是有那么回事。
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
2楼老哥不是啊 常量本身当然不能改变 但改变的是指针所指向的变量中的具体值―― 你的程序结果 因为系统在处理时就是把字符指针当作字符数组来处理的
----------------解决方案--------------------------------------------------------
/* 1 */ #include <stdio.h> void copy(char *to, char *from ) { while((*to++ = *from++)!='\0'); *to='\0'; } void main() { char a[] = "China..."; char b[] = "Long life!"; copy(a, b); printf("%s\n",a); } /* 2 */ #include <stdio.h> void copy(char *to, char *from ) { while((*to++ = *from++)!='\0'); *to='\0'; } void main() { char *a = "China..."; char *b = "Long life!"; copy(a, b); printf("%s\n",a); } 如果不加那个东西很容易出问题,如果后者比前者短的话,你的字符串只是替换了前面的那一部分,而后面的一部分根本没有改变,就不能说是复制了!
----------------解决方案--------------------------------------------------------
关于我的解释,是我自己的理解,6楼的认为我说的不对,vc++ 6.0中对内存泄漏的检查是很严格的,TC我看就未必了,所以搂主的程序可以在TC中运行.
char *a = "China..."; // 指针赋地址操作,简单的说就是把指针指向这个地址,而这个地址存的是一个常量字符串,在vc++ 6.0不能改变其值.
char b[] = "China..."; // 编译器给数组b分配好空间,并且把这些字符串拷贝进来,然后数组的地址就固定了.注意这个过程只能在数组初始化时才能使用.
大家再可以用printf函数打印一下a和b的地址,看看是不是同一个地址!
----------------解决方案--------------------------------------------------------
8楼说额不错,应该用一下alloc函数就可以了.
----------------解决方案--------------------------------------------------------