当前位置:  技术问答>linux和unix

一个超简单(仅5行语句的程序)却又莫名其妙的有趣问题,高手请进。

    来源: 互联网  发布时间:2015-09-04

    本文导语:  #include  int main(int argc, char *argv[]) { char str[25]=""; char sNum[256]; int *pNum=(int*)sNum; pNum[0]=1122; printf("%dn",pNum[0]); } 环境要求:HP-UNIX 这段程序以 aCC -g -o t t.cpp 编译(程序要支持C++的,所以要求用aCC编译) 为什么编译...


#include 

int main(int argc, char *argv[])
{
char str[25]="";

char sNum[256];
int *pNum=(int*)sNum;
pNum[0]=1122;

printf("%dn",pNum[0]);
}

环境要求:HP-UNIX
这段程序以 aCC -g -o t t.cpp 编译(程序要支持C++的,所以要求用aCC编译)
为什么编译后运行,执行pNum[0]=1122;一句总是Bus error(coredump)?

问题出在哪里?而把字符串的初始化部分去掉就能正常运行。
能否不去掉初始化(甚至不改动源程序)就解决问题呢?
或者说为什么会出现这样的问题呢?

问题看似简单,却又奇怪,最好亲自试一下再发表看法。

|
str[25]没有自然对齐,你把它换成str[32]试试。
后面的语句不会有问题。

|
应该不是编译器的问题,而是HP机器体系结构的问题,某些64位机是不允许不对齐访问的,SUN的SPARC也是如此。所以写程序的时候要注意的。

|
还有此等怪事。仔细想了像,大概明白了。

char str[25]; 
char sNum[256];

这个编译器发现紧跟char str[25]后面的sNum为char类型,因此为了节约空间,并没有考虑将sNum的起始地址进行机器字节对齐。而后你又将sNum强制转换成int,然后这个CPU又不像Intel x86一样可以自动处理这种情况,结果出现bus error。

这种情况,我觉得编译器应该有个开关可以控制吧?

|
bus error基本上是编译器对齐方式处理上造成的。也就是说pNum不是个int对齐的地址。

|
应该是内存对齐的问题,有些芯片不充许非偶的整数存取
或者这样定义
union { int n; char num[256]; } var;

v.n = 1122;
v.num[...] = ...

|
不是编译器的问题
数组的内存是分配到栈里的,指针malloc的内存是分配到堆里的,int *pNum=(int*)sNum;这句的效用值的怀疑,一个分配到栈里的内存能否让你用一个指针随便去引用呢?
你可以这样啊
char ptr = new char[100];
int pNum = new ((int*)ptr) int(1122); 


|
这是cpu的问题, 因为int的首地址需要是4的整数倍, 这样强制转换会导致这种core的

|
没有HP-UNIX,在windows平台用mingw的gcc编译运行没有问题

|
大概是aCC编译的问题吧,我在Linux和VC下都试过没问题。
没有HP,抱歉帮不上忙了。

|
和机器实现有关吧
把sNum强制转换成int*的,本来每个域是8个字节变成了32个字节,可能会报内存出错,所以会BUS ERROR
但有的实现计算的时候就是把char当成32位的.

    
 
 

您可能感兴趣的文章:

  • sed 命令语句高手 请进
  • 如何使用UNIX语句来实现这个功能? 高手来看下
  • 请问高手,如何知道一个insert语句执行是否成功呢?
  • 关于SQL语句问题,高手请进,急!!
  • unix shell 中执行带参数的SQL语句问题,望高手帮我解决,谢谢
  • SUSE10下,如何使用perl语言执行一条语句:从一台机器telnet到远端另一台机器,在远端机器上执行命令,并能获取到执行结果。请高手指点,Very 谢谢~
  • dos 高手请进,关于bat中如何使用if 来判断一行命令成功与否后,所执行的分支语句
  • 小问题请教高手:try中的语句为何不执行!!!
  • 各位高手,能帮我解释以下语句的含义吗?关于Vector一个很菜的问题!
  • 循环和条件语句的高手请进,一定给分(就剩18分了),只要你答对。
  • 向高手请教import语句用法!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Mysql增加主键或者更改表的列为主键的sql语句
  • sql语句实例 取得日志条目的sql语句
  • Mysql下在某一列后即表的某一位置添加新列的sql语句
  • C#条件语句、循环语句(if、while)
  • mysql update语句的用法详解
  • c#入门之分支语句使用方法(三元运算符、if语句、switch语句)
  • 在SQL Server的try...catch语句中获取错误消息代码的的语句
  • C#中验证sql语句是否正确(不执行语句)
  • 请教:system("C:\python2.4\python.exe C:\aa.py");该语句有何错误?为什么运行界面一闪就消失了并且没有运行完,请给出正确语句!
  • java有没有类似go语句指定到某条语句?
  • oracle数据库删除数据Delete语句和Truncate语句的使用比较
  • 简单问题:if语句里再写if语句怎么不执行??
  • sql语句之SELECT语句用法示例
  • sqlserver iis7站长之家
  • JAVA基础 语句标签的合法使用,以及{}语句块到底有什么用?
  • sql语句实例 统计页面链接的sql语句
  • 将oracle的create语句更改为alter语句使用
  • ”整型变量j说明为volatile,这样就阻止了优化程序除去循环语句“ 这么理解这句话,为什么会除去循环语句?
  • 小弟今天学到了if语句和case语句,写了个时间脚本,求精简!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3