当前位置: 技术问答>linux和unix
动态申请的内存出错,进来看看
来源: 互联网 发布时间:2015-03-25
本文导语: Linux C编程: 我用动态申请的内存 int *p = malloc();申请成功了。 可是后面用 p 存取数据时,比如 p[200] = 123; 有时会出现 segment fault. (尤其是申请比较大的内存时) 而改用 p[8000] 固定大小的数组,就没有问题。 ...
Linux C编程:
我用动态申请的内存 int *p = malloc();申请成功了。
可是后面用 p 存取数据时,比如 p[200] = 123; 有时会出现 segment fault.
(尤其是申请比较大的内存时)
而改用 p[8000] 固定大小的数组,就没有问题。
这是为什么?如何解决?
我用动态申请的内存 int *p = malloc();申请成功了。
可是后面用 p 存取数据时,比如 p[200] = 123; 有时会出现 segment fault.
(尤其是申请比较大的内存时)
而改用 p[8000] 固定大小的数组,就没有问题。
这是为什么?如何解决?
|
p[200] 是不是出界了。
int *p = malloc();
malloc到底申请多少内存?
int *p = malloc();
malloc到底申请多少内存?
|
同意楼上,
可能是内存越界。
可能是内存越界。
|
应该是内存越界
|
impossibly
it is good way to use gdb tool to debug
it is good way to use gdb tool to debug
|
int *p = malloc(1000);
p[250] 就越界了。 通常都写成
typeT *d = new(number* sizeof(typeT))
p[250] 就越界了。 通常都写成
typeT *d = new(number* sizeof(typeT))
|
楼上的说得对。
|
很奇怪,c下有new函数吗?
我想可能是这样的,你在取p[200]之前,已经将p+ 了快到越界的地方了,
比如这样
unsigned char *p=malloc(1000);
p+=900;
p[200]就出错了。
你可以这样试试:
malloc后,马上察看p的值(指针的值)
p[200]前再察看p值,看看指向的地址是不是同一个地址,如果不是的话,那我想我的判断应该成立。
我想可能是这样的,你在取p[200]之前,已经将p+ 了快到越界的地方了,
比如这样
unsigned char *p=malloc(1000);
p+=900;
p[200]就出错了。
你可以这样试试:
malloc后,马上察看p的值(指针的值)
p[200]前再察看p值,看看指向的地址是不是同一个地址,如果不是的话,那我想我的判断应该成立。
|
不是一定要用sizeof的,sizeof得出的也只不过是个整型,你写1000,也一个样。
|
to yaxii:
不用sizeof安全么,自己写的test还可以,万一要移植……,而且万一什么时候没注意到类型,或者改了类型。搂主就是吃这个亏,你还要他这么干。“sizeof必须用!”要不然设计她干什么?
不用sizeof安全么,自己写的test还可以,万一要移植……,而且万一什么时候没注意到类型,或者改了类型。搂主就是吃这个亏,你还要他这么干。“sizeof必须用!”要不然设计她干什么?
|
UNIX C有时候会因为其它地方程序越界,造成正常代码执行时CORE DUMP。
我曾经有个程序,只要断开SYBASE的连接后一段时间内CORE DUMP了,到现在还没搞明白是哪里写不对了。
我曾经有个程序,只要断开SYBASE的连接后一段时间内CORE DUMP了,到现在还没搞明白是哪里写不对了。