-
strcpy函数在linux上执行异常,在windos执行OK5
代码如下:
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)的地方。
请各位帮忙给看看。
问题补充:<div class="quote_title">asyty 写道</div><div class="quote_div"><pre name="code" class="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);</pre> <br /> <br />这段代码不是果断内存溢出了嚒。。。出错正常的 <br />你定义的长度a,b是5,但是tmp1、tmp2长度都超了,所以溢出的部分你不知道会在内存哪里,有可能修改了其他程序的内存,反正就挂了。。。</div> <br /> <br />其实我最开始的目的是想知道我定义两个数组,在内存中他们的地址是不是连续的。 <br /><pre name="code" class="java">
char a[5];
char b[5];
printf("point a=%d\n",&a);
printf("point b=%d\n",&b);
</pre> <br />代码执行到这里,得出的结果是: <br /><pre name="code" class="java">
point a=2293568
point b=2293552
</pre> <br />地址为什么不连续呢?是不是随机分配的。而且地址值的大小怎么越来越小呢?对内存分配这块不了解,是否有什么资料可以推荐一下呢? <br />ubuntu下的执行结果: <br /><pre name="code" class="java">
point a=-1080353325
point b=-1080353330
</pre>这两个地址的差刚好是5,能不能说明内存中是连续分配的呢? <br /> <br />另外你提到的这个:<div class="quote_title">引用</div><div class="quote_div">有可能修改了其他程序的内存,</div> <br />我也尝试了,将char * tmp1=“xxxxxx.....”,长度设置的很长。但是在windows下还是没有修改到char b[]的内容。 <br />可能还是内存分配的问题吧?2011年11月15日 20:40
4个答案 按时间排序 按投票排序
-
采纳的答案
point a=2293568 point b=2293552
我刚试了下,windows底下好像默认给分配了16字节的数组大小,比如你再定义一个char[5] c; 那么地址应该还是2293552-16 其实还是连续的,这个不是C语言本身的问题,应该是操作系统或者是编译器的差异引起的。
另外 下面这段代码里,b会把a给覆盖掉的。#include <stdio.h> #include <string.h> 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); }
2011年11月15日 22:44
-
引用这两个地址的差刚好是5,能不能说明内存中是连续分配的呢?
ab两个数组是局部变量 ,是放在内存的栈里的,是依次压入栈的,所以按道理必然是连续的
point a=-1080353325 point b=-1080353330
栈(stack)的地址值是倒着来的,先定义的压入底部
对于C来说,理解内存这块是很重要的。刚搜了几篇,你也可以找一些教材或者网上再搜搜“C语言 内存”找些资料看看
http://my.oschina.net/hengcai001/blog/470
http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/
http://www.iteedu.com/myarticle/plang/ccpp/cpointmemory.php
2011年11月15日 22:19
-
strcpy的原型代码实现是
char *strcpy(char *strDestination, const char *strSource) { assert(strDestination && strSource); char *strD=strDestination; while ((*strDestination++=*strSource++)!='\0') NULL; return strD; }
是不会判断strDestination的大小的,直接while循环到strSource的字符为'\0'为止。
http://baike.baidu.com/view/1026861.htm2011年11月15日 21:01
-
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);
这段代码不是果断内存溢出了嚒。。。出错正常的
你定义的长度a,b是5,但是tmp1、tmp2长度都超了,所以溢出的部分你不知道会在内存哪里,有可能修改了其他程序的内存,反正就挂了。。。2011年11月15日 20:57
相关推荐
编写_strcpy函数 函数原型 char* _strcpy(char *strDest, const char *strSrc)
strcpy 函数是 C 语言标准库中的一个字符串复制函数,声明在 string.h 头文件中。其函数原型为 `extern char *strcpy(char *dest, char *src);`,用于将 src 所指的以 NULL 结尾的字符串复制到 dest 所指的数组中。...
主要包含了strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数等代码实现。
通过以上分析,我们可以看到在C语言中手动实现`strcpy`函数不仅能够加深对指针和字符串操作的理解,还能够提高编程技巧,特别是在资源受限或需要完全控制程序执行的情况下。然而,在实际开发中,除非有特殊需求,...
编写 strcpy函数
嵌入式实验课程中的各项实验如编写strcpy函数: 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。不调用C++/C的字符串库函数,请编写...
在深入探讨`strcpy`函数之前,我们先来了解一下这个函数的基本概念和作用。`strcpy`是C语言标准库中的一个字符串处理函数,用于将一个源字符串复制到目标字符串中。其原型通常定义在`string.h`头文件中,但在C++中则...
strcpy 函数和类 String 的构造函数、析构函数、赋值函数和重载运算符函数 strcpy 函数是 C 语言中最基本的字符串拷贝函数,它的原型是 `char *strcpy(char *strDest, const char *strSrc);`,其中 `strDest` 是...
如果其中一个或两个指针为空,`assert` 将会抛出异常并终止程序执行。 - **复制操作**: `while ((*strDest++ = *strSrc++) != '\0')` 这一行是函数的核心部分,实现了字符串的复制。它的工作原理是: - `*strDest++...
Linux运维-嵌入式物联网开发教程-strcpy函数.mp4
strcpy,strcmp,strlen,strcat函数的实现过程
### strstr和strcpy函数实现 在计算机编程领域,字符串处理是不可或缺的一部分。无论是数据验证、文本分析还是用户界面设计,字符串操作都是基础中的基础。本文将详细介绍`strstr`和`strcpy`两个常用字符串处理函数...
编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不能使用strcpy函数。拷贝时,'\0'也要拷贝过去。 (代码提示:for(i=0;i(s2);i++) s1[i]=s2[i];)
在C语言中,`strcpy`函数是用于字符串操作的一个核心函数,它被广泛应用于源字符串到目标字符串的复制。本文将深入探讨`strcpy`函数的用法、工作原理以及可能遇到的安全问题,并提供相关的学习资源。 `strcpy`函数...
Linux内核本身就是用C语言编写的,因此理解C函数在Linux环境中的应用至关重要。一些常用的C函数包括: 1. **标准输入输出函数**:如`printf()`用于输出信息,`scanf()`用于读取用户输入。 2. **内存管理函数**:`...
C语言程序设计-用函数实现字符串的复制, 不允许用strcpy()函数.c
《Linux C 函数详解》是一本专为程序员和系统开发者设计的工具书,全面而深入地探讨了在Linux环境下使用C语言进行程序开发时所涉及的各种函数。这本书旨在帮助读者理解并熟练掌握C语言的标准库函数,以及在Linux系统...
strcpy函数的自定义方法(指针、指针的指针、指针的引用等) 希望对大家有帮助
《Linux C函数手册》是C语言编程在Linux环境下不可或缺的参考资源。这本书籍或文档集主要涵盖了在Linux操作系统中开发C程序时所用到的各种标准库函数、系统调用以及相关的编程接口。以下是对其中一些关键知识点的...
这些函数在编写高效、稳定的Linux程序中扮演着关键角色,通过深入理解和熟练运用,开发者能够更好地驾驭Linux系统。 在提供的三个PDF文档中,LinuxC函数详解分段详细介绍了这些函数的用法和实例,读者可以通过阅读...