| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1134 人关注过本帖
标题:字符数组和指针的问题
只看楼主 加入收藏
wimphy
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-12-1
收藏
 问题点数:0 回复次数:11 
字符数组和指针的问题

#include<iostream>
#include<string>
using namespace std;

void main()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
cout<<string<<endl;

cout<<str1<<endl;
}


不应该出错么?strcpy把11个字符的字符串赋值给10个字符的数组。

[此贴子已经被作者于2006-4-27 12:52:03编辑过]

搜索更多相关主题的帖子: 字符 指针 string char cout 
2006-04-27 12:51
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 

是否出错要看编译器的设置了,比如字节对其方式和是否是调试版本等,这里就讲这两点重要的:
首先,很多编译器的默认字节对齐都是4字节对齐,你定义的数组string实际上占的空间是12字节,所以你虽然拷贝了11字节,仍然不会造成内存错误
其次,如果你运行的是调试版本,那么编译器会在函数压栈时添加一些调试信息,这些信息占用的内存被改写一般情况下是没问题的,而你定义的string数组在大部分编译器编译时都是最后压栈的,所以在该数组之后有一部分调试信息所占内存
你要是讲代码改为:

[CODE]void main()
{
char string[12];
char* str1 = "012345678911";
......
}[/CODE]
并且在release版本下运行,那一般都会出问题,至少VC6编译器就会出错


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-04-27 13:24
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-27 14:08
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
........这样是不行的 char* str1 = "0123456789";
你应该动态申请,然后在赋值
char *str1 = new char[11];

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2006-04-27 14:25
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用激情依旧在2006-4-27 14:25:00的发言:
........这样是不行的 char* str1 = "0123456789";
你应该动态申请,然后在赋值
char *str1 = new char[11];
char* str1 = "0123456789";
这种用法是可以的,在这条语句中str1是作为一个指针指向常数区的常数"0123456789"的地址

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-04-27 16:08
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用song4在2006-4-27 14:08:00的发言:
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清

你用的什么编译器?

[此贴子已经被作者于2006-4-27 16:09:15编辑过]


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-04-27 16:09
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
我用的是DEV,请问怎么跟踪调式信息啊?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-27 17:16
wimphy
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-12-1
收藏
得分:0 
以下是引用aogun在2006-4-27 13:24:00的发言:

是否出错要看编译器的设置了,比如字节对其方式和是否是调试版本等,这里就讲这两点重要的:
首先,很多编译器的默认字节对齐都是4字节对齐,你定义的数组string实际上占的空间是12字节,所以你虽然拷贝了11字节,仍然不会造成内存错误
其次,如果你运行的是调试版本,那么编译器会在函数压栈时添加一些调试信息,这些信息占用的内存被改写一般情况下是没问题的,而你定义的string数组在大部分编译器编译时都是最后压栈的,所以在该数组之后有一部分调试信息所占内存
你要是讲代码改为:

[CODE]void main()
{
char string[12];
char* str1 = "012345678911";
......
}[/CODE]
并且在release版本下运行,那一般都会出问题,至少VC6编译器就会出错

嗯,果然是这样

2006-04-27 18:00
wimphy
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-12-1
收藏
得分:0 
以下是引用song4在2006-4-27 14:08:00的发言:
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清

vc++6.0的话

ctl+shift+f5

2006-04-27 18:02
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

我是说怎么把他调成测试时公布的版本


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-27 21:12
快速回复:字符数组和指针的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049252 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved