0 0

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",&amp;a);
    printf("point b=%d\n",&amp;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",&amp;a,a);
    printf("point b=%d,b=%s\n",&amp;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",&amp;a);
    printf("point b=%d\n",&amp;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 />可能还是内存分配的问题吧?
C 
2011年11月15日 20:40

4个答案 按时间排序 按投票排序

0 0

采纳的答案

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
0 0

引用
这两个地址的差刚好是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
0 0

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.htm

2011年11月15日 21:01
0 0

    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函数

    编写_strcpy函数 函数原型 char* _strcpy(char *strDest, const char *strSrc)

    strcpy函数的用法[总结].pdf

    strcpy 函数是 C 语言标准库中的一个字符串复制函数,声明在 string.h 头文件中。其函数原型为 `extern char *strcpy(char *dest, char *src);`,用于将 src 所指的以 NULL 结尾的字符串复制到 dest 所指的数组中。...

    编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数

    主要包含了strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数等代码实现。

    C程序_不调用库函数,实现strcpy函数

    通过以上分析,我们可以看到在C语言中手动实现`strcpy`函数不仅能够加深对指针和字符串操作的理解,还能够提高编程技巧,特别是在资源受限或需要完全控制程序执行的情况下。然而,在实际开发中,除非有特殊需求,...

    编写 strcpy函数

    编写 strcpy函数

    嵌入式实验编写strcpy函数

    嵌入式实验课程中的各项实验如编写strcpy函数: 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。不调用C++/C的字符串库函数,请编写...

    strcpy函数

    在深入探讨`strcpy`函数之前,我们先来了解一下这个函数的基本概念和作用。`strcpy`是C语言标准库中的一个字符串处理函数,用于将一个源字符串复制到目标字符串中。其原型通常定义在`string.h`头文件中,但在C++中则...

    编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数[文].pdf

    strcpy 函数和类 String 的构造函数、析构函数、赋值函数和重载运算符函数 strcpy 函数是 C 语言中最基本的字符串拷贝函数,它的原型是 `char *strcpy(char *strDest, const char *strSrc);`,其中 `strDest` 是...

    strcpy原型

    如果其中一个或两个指针为空,`assert` 将会抛出异常并终止程序执行。 - **复制操作**: `while ((*strDest++ = *strSrc++) != '\0')` 这一行是函数的核心部分,实现了字符串的复制。它的工作原理是: - `*strDest++...

    Linux运维-嵌入式物联网开发教程-strcpy函数.mp4

    Linux运维-嵌入式物联网开发教程-strcpy函数.mp4

    strcpy等函数实现

    strcpy,strcmp,strlen,strcat函数的实现过程

    strstr和strcpy函数实现

    ### strstr和strcpy函数实现 在计算机编程领域,字符串处理是不可或缺的一部分。无论是数据验证、文本分析还是用户界面设计,字符串操作都是基础中的基础。本文将详细介绍`strstr`和`strcpy`两个常用字符串处理函数...

    C语言程序设计-编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不能使用strcpy函数。拷贝时,

    编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不能使用strcpy函数。拷贝时,'\0'也要拷贝过去。 (代码提示:for(i=0;i(s2);i++) s1[i]=s2[i];)

    深入了解strcpy函数.zip

    在C语言中,`strcpy`函数是用于字符串操作的一个核心函数,它被广泛应用于源字符串到目标字符串的复制。本文将深入探讨`strcpy`函数的用法、工作原理以及可能遇到的安全问题,并提供相关的学习资源。 `strcpy`函数...

    Linux常用C函数和Linux命令大全

    Linux内核本身就是用C语言编写的,因此理解C函数在Linux环境中的应用至关重要。一些常用的C函数包括: 1. **标准输入输出函数**:如`printf()`用于输出信息,`scanf()`用于读取用户输入。 2. **内存管理函数**:`...

    C语言程序设计-用函数实现字符串的复制, 不允许用strcpy()函数.c

    C语言程序设计-用函数实现字符串的复制, 不允许用strcpy()函数.c

    Linux C 函数详解

    《Linux C 函数详解》是一本专为程序员和系统开发者设计的工具书,全面而深入地探讨了在Linux环境下使用C语言进行程序开发时所涉及的各种函数。这本书旨在帮助读者理解并熟练掌握C语言的标准库函数,以及在Linux系统...

    strcpy函数的自定义方法(指针、指针的指针、指针的引用等)

    strcpy函数的自定义方法(指针、指针的指针、指针的引用等) 希望对大家有帮助

    linuxC函数手册.chm

    《Linux C函数手册》是C语言编程在Linux环境下不可或缺的参考资源。这本书籍或文档集主要涵盖了在Linux操作系统中开发C程序时所用到的各种标准库函数、系统调用以及相关的编程接口。以下是对其中一些关键知识点的...

    Linux函数详解(函数大全)

    这些函数在编写高效、稳定的Linux程序中扮演着关键角色,通过深入理解和熟练运用,开发者能够更好地驾驭Linux系统。 在提供的三个PDF文档中,LinuxC函数详解分段详细介绍了这些函数的用法和实例,读者可以通过阅读...

Global site tag (gtag.js) - Google Analytics