qq_33133771
风雅_乌龟
2015-12-21 11:04
采纳率: 100%
浏览 1.6k
已采纳

一个关于VC6下strcpy函数的问题

#include
using namespace std;
#include
void main()
{
int b,b1,b2;
char p2[4];
char p[3]={"dsfs","jasa","ussg"};
int a1=1,a2=1;
strcpy(p2,
(p+a1));//同下
strcpy(*(p+a1),*(p+a2));//为什么运行这句会出现运行停止
strcpy(*(p+a2),p2);//同上
b=strlen(*(p+a1))-1;//但是为什么这两句又不会出错
b1=strlen(*(p+a2))-1;
b2=b>b1?b1:b;

for(int a4=0;a4<3;a4++){
cout<<*(p+a4)<<b<<" ";}
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • wenpinglaoyao
    纹枰老妖 2015-12-21 12:22
    已采纳

    题主,我又看了您在其它回答下面的回复,在这里帮您解惑一下。首先,strlen为什么不崩溃,这是因为strlen并不做修改等工作,它仅仅是为了统计长度,自然不会崩溃。 然后,像【char a[3] = "hu";】这种代码,a的地址是处于堆栈区的。打个比方,a的地址是1111,而那个【"hu"】所处的位置却是常量区【比如地址是9876】,那个【a[3] = "hu";】时会发生什么呢?程序会记住【"hu"】的地址9876,然后从这个位置开始,逐一拷贝字符内容到a地址1111上。。。

    点赞 评论
  • tanjunchen
    远方的飞猪 2015-12-21 11:11

    char p[3]={"dsfs","jasa","ussg"};
    too many initializers for 'char [3]'|
    char 不能这样定义的
    strlen没有定义

    点赞 评论
  • tanjunchen
    远方的飞猪 2015-12-21 11:13

    你的题目是什么呀?你可以定义一个二维数组

    点赞 评论
  • dragonvii
    dragonvii 2015-12-21 11:23
     #include "stdafx.h"
    #include "stdio.h"
    #include "string.h"
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    int b,b1,b2;
     char p2[5]; 
     char p[3][5]={ "dsfs","jasa","ussg"};
     int a1=1,a2=1;
     strcpy(p2, p[a1]);//同下
    strcpy( p[a1], p[a2]);//为什么运行这句会出现运行停止
    strcpy( p[a2],p2);//同上
    b=strlen( p[a1] )-1;//但是为什么这两句又不会出错
    b1=strlen( p[a2] )-1;
     b2=b>b1?b1:b;
    
    for(int a4=0;a4<3;a4++){
        printf( "p[%d]=%s\r\n", a4, p[a4] );
     }
    
    }
    
    
    
    点赞 评论
  • qq_27183003
    ysuwood 2015-12-21 11:24

    用指针数组:

    void main()
    { 
        int b,b1,b2;
        char p2[4]; 
        char *p[3]={"dsfs","jasa","ussg"}; //修改为指针数组
        int a1=1,a2=1;
        strcpy(p2,*(p+a1));//同下
        strcpy(*(p+a1),*(p+a2));//为什么运行这句会出现运行停止
        strcpy(*(p+a2),p2);//同上
        b=strlen(*(p+a1))-1;//但是为什么这两句又不会出错
        b1=strlen(*(p+a2))-1;
        b2=b>b1?b1:b;
        for(int a4=0;a4<3;a4++){
            cout<<*(p+a4)<<b<<" ";}
    }
    
    点赞 评论
  • dragonvii
    dragonvii 2015-12-21 11:25

    你要理解堆和栈
    char p[3]={"dsfs","jasa","ussg"}; 是栈内存
    你需要在堆上分配内存才能修改

    点赞 评论
  • wenpinglaoyao
    纹枰老妖 2015-12-21 11:33

    题主,把您代码中的星号去掉,比如【strcpy(*(p+a1),*(p+a2))】改成【strcpy(p+a1, p+a2)】。

    strcpy函数的原型如下:char strcpy(char dest, const char src); 可以看出,它所接收的两个参数类型必须为字符指针的类型。而您代码中的【(p+a1)】所传递过去的实际上是一个字符值

    点赞 评论
  • dragonvii
    dragonvii 2015-12-21 13:27

    C/C++编译的程序的内存分为以下几个部分

    1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。
    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
    未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。

    4、常量字符串区 —存放常量字符串的区域。 程序结束后由系统释放

    5、程序代码区—存放函数体的二进制代码。

    点赞 评论
  • dragonvii
    dragonvii 2015-12-21 13:29

    只要弄清楚这些概念就不会出现楼主的疑问了

    点赞 评论

相关推荐