新微赢技术网
标题:
字符数组和指针的问题
[打印本页]
作者:
ωǒ↘倫↙
时间:
2009-11-3 01:33
标题:
字符数组和指针的问题
#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
是否出错要看编译器的设置了,比如字节对其方式和是否是调试版本等,这里就讲这两点重要的:
首先,很多编译器的默认字节对齐都是4字节对齐,你定义的数组string实际上占的空间是12字节,所以你虽然拷贝了11字节,仍然不会造成内存错误
其次,如果你运行的是调试版本,那么编译器会在函数压栈时添加一些调试信息,这些信息占用的内存被改写一般情况下是没问题的,而你定义的string数组在大部分编译器编译时都是最后压栈的,所以在该数组之后有一部分调试信息所占内存
你要是讲代码改为:
void main()
{
char string[12];
char* str1 = "012345678911";
......
}
复制代码
并且在release版本下运行,那一般都会出问题,至少VC6编译器就会出错
作者:
々無極風嘯々
时间:
2009-11-3 01:33
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清
作者:
梦缘o☆无恒
时间:
2009-11-3 01:33
........这样是不行的 char* str1 = "0123456789";
你应该动态申请,然后在赋值
char *str1 = new char[11];
作者:
ˇ风逍遥ˇ
时间:
2009-11-3 01:33
以下是引用激情依旧在2006-4-27 14:25:00的发言:
........这样是不行的 char* str1 = "0123456789";
你应该动态申请,然后在赋值
char *str1 = new char[11];
char* str1 = "0123456789";
这种用法是可以的,在这条语句中str1是作为一个指针指向常数区的常数"0123456789"的地址
作者:
为爱种菜!
时间:
2009-11-3 01:33
以下是引用song4在2006-4-27 14:08:00的发言:
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清
你用的什么编译器?
作者:
航母风云
时间:
2009-11-3 01:33
我用的是DEV,请问怎么跟踪调式信息啊?
作者:
first
时间:
2009-11-3 01:33
以下是引用aogun在2006-4-27 13:24:00的发言:
是否出错要看编译器的设置了,比如字节对其方式和是否是调试版本等,这里就讲这两点重要的:
首先,很多编译器的默认字节对齐都是4字节对齐,你定义的数组string实际上占的空间是12字节,所以你虽然拷贝了11字节,仍然不会造成内存错误
其次,如果你运行的是调试版本,那么编译器会在函数压栈时添加一些调试信息,这些信息占用的内存被改写一般情况下是没问题的,而你定义的string数组在大部分编译器编译时都是最后压栈的,所以在该数组之后有一部分调试信息所占内存
你要是讲代码改为:
void main()
{
char string[12];
char* str1 = "012345678911";
......
}
复制代码
并且在release版本下运行,那一般都会出问题,至少VC6编译器就会出错
嗯,果然是这样
作者:
我是医师
时间:
2009-11-3 01:33
以下是引用song4在2006-4-27 14:08:00的发言:
楼上的帅哥
测试版的怎么调呀
我们老师调了我没看清
vc++6.0的话
ctl+shift+f5
作者:
︶ぺ雨湮ㄣ
时间:
2009-11-3 01:33
我是说怎么把他调成测试时公布的版本
欢迎光临 新微赢技术网 (http://bbs.weiying.cn/)
Powered by Discuz! X3.2