字符数组长度引起的奇怪的错误

小魔菇 2009-12-20 06:46:54

char output[16];
fun(output);

执行出错

char output[32];
fun(output);

执行没问题

我的fun函数是空的 一句代码都没有
两段代码唯一的区别是output的长度 一个是16 一个是32位
char传进去之后 就是个指针 应该都一样的吧

怎么会出现这样的错误 以前没有见过

会不会是跟函数调用的时候堆栈有关系? 怎么会出现这样的错误? 请高手指点一下
...全文
256 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
drinker_linux 2009-12-21
  • 打赏
  • 举报
回复
学习了
haierpro 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 haierpro 的回复:]
有点像栈溢出了,但可能性不大。
[/Quote]

搞错了,大数组没问题,小数组有问题,算我没说。
haierpro 2009-12-21
  • 打赏
  • 举报
回复
有点像栈溢出了,但可能性不大。
小魔菇 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 hairetz 的回复:]
肯定不是因为你传的数组元素长不同而出错。
你是不是在其他地方用到了这个指针,而长度不同导致越界?
[/Quote]
恩 我也觉得不应该是数组长度的原因
但是其他的地方也没有用到这个指针
可能是其他的原因吧 还在找哈
  • 打赏
  • 举报
回复
肯定不是因为你传的数组元素长不同而出错。
你是不是在其他地方用到了这个指针,而长度不同导致越界?
小魔菇 2009-12-21
  • 打赏
  • 举报
回复
RHEL 5 gcc version 4.1.1

晚上回宿舍了 上不起网 呵呵

我在想
char output[16]和char output[32]
作为局部变量和参数在函数中 对堆栈的影响是
一个是
sub esp,0x10
一个是
sub esp,0x20

在itoa的函数中,他们都是作为指针传进去的
通过 mov eax,[ebp + 8]

所以我猜测问题出在
sub esp,0x10
或者sub esp,0x20这两句汇编代码上
也许我堆栈本身的问题吧
我调试调试先 解决了 就跟大家分享一下
希望各位牛人从堆栈啊 内存啊 这些角度出发 猜测一下 呵呵
msdn2009_2010 2009-12-21
  • 打赏
  • 举报
回复
up
haohaokingXP 2009-12-21
  • 打赏
  • 举报
回复
char output[16];
itoa(output,input);
//为了排除错误 我把itoa函数都设置为空了,把下一行也给隐去了
//如果把output[16]改成output[24]什么的 就对了
// disp_str(output);


itoa(output,input);
函数是不是汇编编写的,可能是sub esp,XX,

XX没有正确。
  • 打赏
  • 举报
回复
汇编存在的地方就是我悲剧的地方
selooloo 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cnzdgs 的回复:]
具体是出什么错?什么运行环境?
[/Quote]
来了个牛人
cattycat 2009-12-20
  • 打赏
  • 举报
回复
把你写的那个itoa改个名字吧,跟库函数冲突了,即使没用到库函数也有可能会冲突的。
cnzdgs 2009-12-20
  • 打赏
  • 举报
回复
具体是出什么错?什么运行环境?
vanchristin 2009-12-20
  • 打赏
  • 举报
回复
数组作形参的时候,传递的不是指针吗,就是数组首地址
不知道问题在哪里,期待解答
小魔菇 2009-12-20
  • 打赏
  • 举报
回复
可能是其他的原因吧
这段代码调式也不方便
我还是先用汇编调试一下 比较一下 看有什么不同
晴天1999 2009-12-20
  • 打赏
  • 举报
回复
新手哈!多多指教哟!
yangch_nhcmo 2009-12-20
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

void fun(char chr[])
{
return ;
}

int main()
{
char chr0[16];
char chr1[32];

fun(chr0);
fun(chr1);

return 0;
}
//GCC4.3.2 编译没问题
yxwsbobo 2009-12-20
  • 打赏
  • 举报
回复
任何情况下都不会因为传入的字符数组的长度而导致错误


因为你传给的参数只是一个地址而已,和数组长度没有任何关系。


根据你的情况,估计是碰巧没遇到错误
小魔菇 2009-12-20
  • 打赏
  • 举报
回复
不好意思 刚才没说清楚
所有的函数都是我自己写的
没有用到任何库


还有 什么情况下 什么情况下会因为传入的字符数组的长度而导致的错误?
对齐?
堆栈?
还是其他的?
kouwenlong 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 eclipse_2 的回复:]
itoa被我设置为空了
C/C++ code
PUBLICvoid itoa(char* str,int num)
{
}
[/Quote]
itoa你置空了?itoa是库函数,你的为你的函数改个名字。
小魔菇 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kouwenlong 的回复:]
你的itoa格式错了吧。
它的原型:
C/C++ codechar*itoa(int value,char*string,int radix);
[/Quote]

所有的函数都是偶自己写的哈
没有用到任何库
加载更多回复(9)

69,371

社区成员

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

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