找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1510|回复: 9

字符数组和指针的问题

[复制链接]
发表于 2009-11-3 01:33:08 | 显示全部楼层 |阅读模式 IP:江苏扬州
#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个字符的数组。
发表于 2009-11-3 01:33:09 | 显示全部楼层 IP:江苏扬州
是否出错要看编译器的设置了,比如字节对其方式和是否是调试版本等,这里就讲这两点重要的:
首先,很多编译器的默认字节对齐都是4字节对齐,你定义的数组string实际上占的空间是12字节,所以你虽然拷贝了11字节,仍然不会造成内存错误
其次,如果你运行的是调试版本,那么编译器会在函数压栈时添加一些调试信息,这些信息占用的内存被改写一般情况下是没问题的,而你定义的string数组在大部分编译器编译时都是最后压栈的,所以在该数组之后有一部分调试信息所占内存
你要是讲代码改为:
  1. void main()
  2. {
  3. char string[12];
  4. char* str1 = "012345678911";
  5. ......
  6. }
复制代码

并且在release版本下运行,那一般都会出问题,至少VC6编译器就会出错
回复

使用道具 举报

发表于 2009-11-3 01:33:10 | 显示全部楼层 IP:江苏扬州
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清
回复

使用道具 举报

发表于 2009-11-3 01:33:11 | 显示全部楼层 IP:江苏扬州
........这样是不行的 char* str1 = "0123456789";
你应该动态申请,然后在赋值
char *str1 = new char[11];
回复

使用道具 举报

发表于 2009-11-3 01:33:14 | 显示全部楼层 IP:江苏扬州
以下是引用激情依旧在2006-4-27 14:25:00的发言:
........这样是不行的 char* str1 = "0123456789";
你应该动态申请,然后在赋值
char *str1 = new char[11];

char* str1 = "0123456789";
这种用法是可以的,在这条语句中str1是作为一个指针指向常数区的常数"0123456789"的地址
回复

使用道具 举报

发表于 2009-11-3 01:33:20 | 显示全部楼层 IP:江苏扬州
以下是引用song4在2006-4-27 14:08:00的发言:
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清
你用的什么编译器?
回复

使用道具 举报

发表于 2009-11-3 01:33:21 | 显示全部楼层 IP:江苏扬州
我用的是DEV,请问怎么跟踪调式信息啊?
回复

使用道具 举报

发表于 2009-11-3 01:33:22 | 显示全部楼层 IP:江苏扬州
以下是引用aogun在2006-4-27 13:24:00的发言:

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

并且在release版本下运行,那一般都会出问题,至少VC6编译器就会出错
嗯,果然是这样
回复

使用道具 举报

发表于 2009-11-3 01:33:23 | 显示全部楼层 IP:江苏扬州
以下是引用song4在2006-4-27 14:08:00的发言:
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清
vc++6.0的话

ctl+shift+f5
回复

使用道具 举报

发表于 2009-11-3 01:33:24 | 显示全部楼层 IP:江苏扬州
我是说怎么把他调成测试时公布的版本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 05:22 , Processed in 0.384749 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表