IBM C for AIX 4.3的关于stack的问题

penghwa 2002-07-25 09:54:32
一个例子,运行在IBM RS6000, os:AIX4.3.3, C:IBM C for AIX 4 :
#include <stdio.h>

#define LMTSIZE 32000 /*调用时参数的大小*/

typedef struct {
char sParam[LMTSIZE+1];
int iVal;
} CS ;

void funCallByVal(), funCallByRef();

main()
{
CS cs;

memset(cs.sParam, 'A', LMTSIZE);
cs.sParam[LMTSIZE-1]='B';
cs.iVal=12345;

funCallByVal(cs);
funCallByRef(&cs);
}

void funCallByVal(CS stVal)
{
printf("Call By Val:iVal=%d,stParam[%d]=%c \n",
stVal.iVal, LMTSIZE-1, stVal.sParam[LMTSIZE-1]);
}

void funCallByRef(CS *stRef)
{
printf("Call By Ref:iVal=%d,stParam[%d]=%c \n",
stRef->iVal, LMTSIZE-1,stRef->sParam[LMTSIZE-1]);
}
编译:cc -go file1 file1.c

当我设定LMTSIZE为32000时,执行结果为:
Call By Val:iVal=12345,stParam[31999]=B
Call By Ref:iVal=12345,stParam[31999]=B
结果正确。
而设定LMTSIZE为33000及以上时,执行结果为:
Call By Val:iVal=1094795585,stParam[32999]=A
Call By Ref:iVal=12345,stParam[32999]=B
结果是错误的!
参数的大小只能在32768以下,而我的stack为32768K.将问题反映到IBM技术支持部去,他们说在C for AIX 5的版本上是正确的.
看网上有没有高手能解决问题!!

...全文
41 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
blh 2002-09-09
  • 打赏
  • 举报
回复
给你提个建议,请不要在这种问题上浪费时间!!
程序的stack是宝贵的,你使用适应该珍惜,本来程序设计时很大的变量需要在堆中建立,你非要发起到而行之,定义大的局部变量除了证明系统无法支持你的程序外,没有任何益处,呵呵
penghwa 2002-08-12
  • 打赏
  • 举报
回复
看来无人能解了。
我用gcc for aix编译出的程序是没问题的。
谁有ibm c for aix 4.X和5.X的两个版本吗,帮我试下,是不是ibm c自身的问题呢
wiler 2002-08-02
  • 打赏
  • 举报
回复
难道数组上限是32768
试试用全局变量看看
unsigned int Size=33000;
ckc 2002-07-25
  • 打赏
  • 举报
回复
#define LMTSIZE 32000 /*调用时参数的大小*/
不要用define,用const int 试一下
penghwa 2002-07-25
  • 打赏
  • 举报
回复
不对,是32位的系统,改过也不行的。
问题是,我在调用时是与数据库表的结构对应的,在大的数组后可能有很多其它的数据类型存在。
并且我用:
char *pCS;
int pos;
pCS=(char *)&stVal;
for ( pos = 0; pos < sizeof(CS); pos++ )
{
printf("the pos(%d) in CS value is %d %c",
pos, *(pCS+pos), (pos%5?' ':'\n'));
}
打印的结果能真实的反映结构里的值。
penghwa 2002-07-25
  • 打赏
  • 举报
回复
不对,是32位的系统,改过也不行的。
问题是,我在调用时是与数据库表的结构对应的,在大的数组后可能有很多其它的数据类型存在。
并且我用:
char *pCS;
int pos;
pCS=(char *)&stVal;
for ( pos = 0; pos < sizeof(CS); pos++ )
{
printf("the pos(%d) in CS value is %d %c",
pos, *(pCS+pos), (pos%5?' ':'\n'));
}
打印的结果能真实的反映结构里的值。
cpls 2002-07-25
  • 打赏
  • 举报
回复
可能aix下,sizeof(int)=2;如果这样,unsigned int 最大值为65535,int则只有一半。
cpls 2002-07-25
  • 打赏
  • 举报
回复
typedef struct {
char sParam[LMTSIZE+1];
int iVal;//改成long lVal;试试
} CS ;
penghwa 2002-07-25
  • 打赏
  • 举报
回复
ulimit -a
stack为32768K,试增过,但仍不行!
倒是stack的大小与函数的调用层次成反比,过大有段错误的coredump
anrxhzh 2002-07-25
  • 打赏
  • 举报
回复
试试 ulimit 命令
anrxhzh 2002-07-25
  • 打赏
  • 举报
回复
试试 ulimit 命令
penghwa 2002-07-25
  • 打赏
  • 举报
回复
to ckc(火) :
这样的结果stVal.sParam[LMTSIZE-1]的值是正确的,但stVal.iVal的值仍不正确,仍为4个A的值(0x41414141)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧