遇到了个从没遇到的问题

tc1hen 2017-05-28 08:06:38
操作系统(AIX 64位),一个函数完成的功能是,发送和接收XML报文,存储这个XML报文的局部变量最大长度是1024 * 96,这个函数中还定义了其他局部变量,发送之前还有值,非常疑惑的一点是,当接收到报文时,大概40000多字节,那些其他这个函数中局部变量的内容都被冲成返回的XML报文字符串的内容了,这是我从来没遇到过的,谁能帮我解释下为何会出现这种情况,每个局部变量的名字都不一样,难道地址还会冲突吗?
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tc1hen 2017-05-29
  • 打赏
  • 举报
回复
引用 1 楼 qq_20553613 的回复:
[quote=引用 楼主 tc1hen 的回复:] 操作系统(AIX 64位),一个函数完成的功能是,发送和接收XML报文,存储这个XML报文的局部变量最大长度是1024 * 96,这个函数中还定义了其他局部变量,发送之前还有值,非常疑惑的一点是,当接收到报文时,大概40000多字节,那些其他这个函数中局部变量的内容都被冲成返回的XML报文字符串的内容了,这是我从来没遇到过的,谁能帮我解释下为何会出现这种情况,每个局部变量的名字都不一样,难道地址还会冲突吗?
这么大的内存,要从堆上分配,手动malloc一段内存呗。[/quote] 之前也是想这样做来的,但是我这次对系统架构的改造,通讯这块能不动尽量不动,至于为什么不动,你懂得
tc1hen 2017-05-29
  • 打赏
  • 举报
回复
引用 3 楼 tomsoft 的回复:
Sorry,想了一下,不是堆栈溢出,刚在我系统中看了一下,我的64位系统的堆栈大小是8M,而从现象上看并不像堆栈溢出。您仍可以用ulimit -a确认一下,我相信栈大小应该足够了。通常32位系统可能会有栈的问题。如果是堆栈不够,则程序在返回时会崩溃,而非简单破坏临时变量。 因为临时变量和您定义的数组都是在堆栈中,因此,产生这个问题很显然是数组越界。结合您所说,数组大小96K,而大约读入40K个字符出错,那请您注意检查: 1)96K的数组是字节大小还是字大小。即是96KBytes还是96KWord 2)40K个字符串,请问字串是单字节的吗?如果是多字节的,如汉字或UTF等,40K就会造成读入96KBytes的字符出现数组越界的问题。
是一个宏的用法出现了问题,这个数组实际上定义的长度大小是10240,我改过之后好了,两个宏一个名字,那个发送XML报文的函数所包含的头文件里的宏定义是1024 * 96
tc1hen 2017-05-29
  • 打赏
  • 举报
回复
引用 3 楼 tomsoft 的回复:
Sorry,想了一下,不是堆栈溢出,刚在我系统中看了一下,我的64位系统的堆栈大小是8M,而从现象上看并不像堆栈溢出。您仍可以用ulimit -a确认一下,我相信栈大小应该足够了。通常32位系统可能会有栈的问题。如果是堆栈不够,则程序在返回时会崩溃,而非简单破坏临时变量。 因为临时变量和您定义的数组都是在堆栈中,因此,产生这个问题很显然是数组越界。结合您所说,数组大小96K,而大约读入40K个字符出错,那请您注意检查: 1)96K的数组是字节大小还是字大小。即是96KBytes还是96KWord 2)40K个字符串,请问字串是单字节的吗?如果是多字节的,如汉字或UTF等,40K就会造成读入96KBytes的字符出现数组越界的问题。
谢了兄弟问题找到了,就是数组越界了,把这个函数栈里的内容都覆盖了,
赵4老师 2017-05-29
  • 打赏
  • 举报
回复
学会使用数据断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
「已注销」 2017-05-29
  • 打赏
  • 举报
回复
Sorry,想了一下,不是堆栈溢出,刚在我系统中看了一下,我的64位系统的堆栈大小是8M,而从现象上看并不像堆栈溢出。您仍可以用ulimit -a确认一下,我相信栈大小应该足够了。通常32位系统可能会有栈的问题。如果是堆栈不够,则程序在返回时会崩溃,而非简单破坏临时变量。 因为临时变量和您定义的数组都是在堆栈中,因此,产生这个问题很显然是数组越界。结合您所说,数组大小96K,而大约读入40K个字符出错,那请您注意检查: 1)96K的数组是字节大小还是字大小。即是96KBytes还是96KWord 2)40K个字符串,请问字串是单字节的吗?如果是多字节的,如汉字或UTF等,40K就会造成读入96KBytes的字符出现数组越界的问题。
「已注销」 2017-05-29
  • 打赏
  • 举报
回复
AIX的堆栈限制是32768,即实际在差不多这个数值后(比这个值略小),就会破坏堆栈 可以使用ulimit -a看以下您堆栈的设置 试一下ulimit -s unlimited
Acuity. 2017-05-28
  • 打赏
  • 举报
回复
引用 楼主 tc1hen 的回复:
操作系统(AIX 64位),一个函数完成的功能是,发送和接收XML报文,存储这个XML报文的局部变量最大长度是1024 * 96,这个函数中还定义了其他局部变量,发送之前还有值,非常疑惑的一点是,当接收到报文时,大概40000多字节,那些其他这个函数中局部变量的内容都被冲成返回的XML报文字符串的内容了,这是我从来没遇到过的,谁能帮我解释下为何会出现这种情况,每个局部变量的名字都不一样,难道地址还会冲突吗?
这么大的内存,要从堆上分配,手动malloc一段内存呗。

69,368

社区成员

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

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