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

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

char output[16];
fun(output);

执行出错

char output[32];
fun(output);

执行没问题

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

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

会不会是跟函数调用的时候堆栈有关系? 怎么会出现这样的错误? 请高手指点一下
...全文
260 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

70,020

社区成员

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

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