strcpy函数在linux上执行异常,在windos执行OK

代码如下:

    char a[5];
    char b[5];
    printf("point a=%d\n",&a);
    printf("point b=%d\n",&b);
    memset(a,0x00,sizeof(a));
    memset(b,0x00,sizeof(b));
    char * tmp1="123456789";
    char * tmp2="abcde";
    strcpy(a,tmp1);
    strcpy(b,tmp2);
    printf("point a=%d,a=%s\n",&a,a);
    printf("point b=%d,b=%s\n",&b,b);

 该代码在window上执行成功的。gcc版本:gcc version 3.4.2 (mingw-special)

 

在ubuntu上执行报段错误,gcc版本:gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

ubuntu版本:Linux ubuntu 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux

 

其中在ubuntu上执行报错的是在第二个strcpy(b,tmp2)的地方。

请各位帮忙给看看。

[code="java"]point a=2293568
point b=2293552[/code]
我刚试了下,windows底下好像默认给分配了16字节的数组大小,比如你再定义一个char[5] c; 那么地址应该还是2293552-16 其实还是连续的,这个不是C语言本身的问题,应该是操作系统或者是编译器的差异引起的。

另外 下面这段代码里,b会把a给覆盖掉的。
[code="java"]#include
#include
int main() {
char a[5];
char b[5];
printf("point a=%d\n",&a);
printf("point b=%d\n",&b);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
char * tmp1="12345";
char * tmp2="abcdefghijklmlopqrstuvwxyz";

strcpy(a,tmp1);
strcpy(b,tmp2);

printf("point a=%d,a=%s\n",&a,a);
printf("point b=%d,b=%s\n",&b,b);

}[/code]

[code="java"] char a[5];
char b[5];
printf("point a=%d\n",&a);
printf("point b=%d\n",&b);
memset(a,0x00,sizeof(a));
memset(b,0x00,sizeof(b));
char * tmp1="123456789";
char * tmp2="abcde";
strcpy(a,tmp1);
strcpy(b,tmp2);
printf("point a=%d,a=%s\n",&a,a);
printf("point b=%d,b=%s\n",&b,b);[/code]

这段代码不是果断内存溢出了嚒。。。出错正常的
你定义的长度a,b是5,但是tmp1、tmp2长度都超了,所以溢出的部分你不知道会在内存哪里,有可能修改了其他程序的内存,反正就挂了。。。

strcpy的原型代码实现是
[code="java"]char *strcpy(char *strDestination, const char *strSource)
{
  assert(strDestination && strSource);
  char *strD=strDestination;
  while ((*strDestination++=*strSource++)!='\0')
  NULL;
  return strD;
}[/code]
是不会判断strDestination的大小的,直接while循环到strSource的字符为'\0'为止。

[url]http://baike.baidu.com/view/1026861.htm[/url]

[quote]这两个地址的差刚好是5,能不能说明内存中是连续分配的呢?[/quote]
ab两个数组是局部变量 ,是放在内存的栈里的,是依次压入栈的,所以按道理必然是连续的

[code="java"]
point a=-1080353325
point b=-1080353330[/code]
栈(stack)的地址值是倒着来的,先定义的压入底部

对于C来说,理解内存这块是很重要的。刚搜了几篇,你也可以找一些教材或者网上再搜搜“C语言 内存”找些资料看看
[url]http://my.oschina.net/hengcai001/blog/470[/url]
[url]http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/[/url]
[url]http://www.iteedu.com/myarticle/plang/ccpp/cpointmemory.php[/url]