#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<<" ";}
}
题主,我又看了您在其它回答下面的回复,在这里帮您解惑一下。首先,strlen为什么不崩溃,这是因为strlen并不做修改等工作,它仅仅是为了统计长度,自然不会崩溃。 然后,像【char a[3] = "hu";】这种代码,a的地址是处于堆栈区的。打个比方,a的地址是1111,而那个【"hu"】所处的位置却是常量区【比如地址是9876】,那个【a[3] = "hu";】时会发生什么呢?程序会记住【"hu"】的地址9876,然后从这个位置开始,逐一拷贝字符内容到a地址1111上。。。
char p[3]={"dsfs","jasa","ussg"};
too many initializers for 'char [3]'|
char 不能这样定义的
strlen没有定义
你的题目是什么呀?你可以定义一个二维数组
#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] );
}
}
用指针数组:
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<<" ";}
}
你要理解堆和栈
char p[3]={"dsfs","jasa","ussg"}; 是栈内存
你需要在堆上分配内存才能修改
题主,把您代码中的星号去掉,比如【strcpy(*(p+a1),*(p+a2))】改成【strcpy(p+a1, p+a2)】。
strcpy函数的原型如下:char strcpy(char dest, const char src); 可以看出,它所接收的两个参数类型必须为字符指针的类型。而您代码中的【(p+a1)】所传递过去的实际上是一个字符值
C/C++编译的程序的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。
4、常量字符串区 —存放常量字符串的区域。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
只要弄清楚这些概念就不会出现楼主的疑问了