请问一下下面的代码,为什么错了,,在code::blocks中可以很好运行,但在visual studio 2010中就是错的呢

#include <stdio.h>
int main()
{
void copy_string(char *from,char *to);
char *a="I am a teacher.";
printf("%d\n",sizeof(a));
char b[]="You are a student.";
char *p=b;
printf("string a=%s\nstring b=%s\n",a,b);
printf("\ncopy string a to string b:\n");
copy_string(a,p);
printf("string a=%s\nstring b=%s\n",a,b);
return 0;
}

void copy_string(char *from,char *to)
{
while(*to++=*from++);
}
昨天我吃完饭后去上课,想了一下这个问题。今天我知道是怎么回事了。就是第六行的这句的问题。printf("%d\n",sizeof(a));其实,这是书上的原代码。这句是我自己加的。我想测试一下编译环境给a这个指针变量分配多少个字节。其实在code::blocks中是可以将这个语句放在一些定义的变量或常量前的,但在微软的编译系统中不行。如果将printf("%d\n",sizeof(a));这句放在char *p=b;的后面的行中就没问题了。可能是不同的编译系统编译方式和要求不同吧。

第1个回答  2012-11-27
这肯定是错的 char *a="I am a teacher."; 这句话的意思是,我找一个指针a指向一个字符串,这个没有问题,问题是这个字符串的地址和a的地址不是相邻的。因为你没有用new开辟数组。这样当你调用a++的时候,指针会指向a的下一个地址,因为没有开辟,所以我不知道下一个地址放的是什么,这样就越界了。为了保护系统所以才会报错。char b[]="You are a student."; 就不同了,b开辟了数组,所以b之后的地址系统是知道的。 所以以后一用到char* a;接下来就应该考虑给他分配内存,不然就会出现一个运行错误! 编译是没有问题的!
第2个回答  2012-11-27
字符串常量和字符数组搞混了。。。追问

这代码是没错的。看我补充的就知道了。

第3个回答  2012-11-27
代码应该没什么问题,报什么错?追问

对啊,,哈哈,其实是微软那个编译的环境有问题。

相似回答