此问题在此处已有答案:
I can use more memory than how much I've allocated with malloc(), why?(17回答)
9年前关闭。
正如我所知,malloc在内存中分配特定数量的字节。然而,我试图使用它,我分配4个字节,但它给我没有错误,当我试图存储超过4(最多200个整数)的元素在数组中!!所以在我的代码中我不需要使用realloc!我用的是Linux。最后,我很乐意听取你的任何建议...先谢谢你。
tmp.h:
#ifndef TMP_H
#define TMP_H
#define MAXLENGTH 4
#define GROWFACTOR 1.5
typedef struct stVector
{
int *vec;
int length;
int maxLength;
}Vector;
Vector newEmptyVector();
void addElement(Vector *vec, int elt);
#endif
字符串
tmp.c:
#include "stdio.h"
#include "stdlib.h"
#include "tmp.h"
Vector newEmptyVector()
{
Vector vec;
vec.vec = (int*) malloc(0);
printf("Allocating %d bytes\n", sizeof(int)*MAXLENGTH );
vec.length = 0;
vec.maxLength = MAXLENGTH;
return vec;
}
void addElement(Vector *vec, int elt)
{
/*if(vec->length == vec->maxLength)
{
vec->vec = (int*)realloc(vec->vec,sizeof(int)* vec->maxLength * GROWFACTOR);
vec->maxLength = vec->maxLength * GROWFACTOR;
}*/
vec->vec[vec->length++] = elt;
}
型
main.c:
#include"tmp.h"
int main(int argc, char const *argv[])
{
Vector vector = newEmptyVector();
printf("The length is %i and maxlength is ` `%i\n",vector.length,vector.maxLength);
addElement(&vector,5);
addElement(&vector,3);
addElement(&vector,1);
addElement(&vector,7);
printf("The length is %i and maxlength is ` `%i\n",vector.length,vector.maxLength);
addElement(&vector,51);
printf("The length is %i and maxlength is %i\n",vector.length,vector.maxLength);
for (int i = 0; i < 200; ++i)
{
addElement(&vector,i);
printf("The length is %i and maxlength is %i\n" ,vector.length, vector.maxLength);
}
return 0;
}
型
3条答案
按热度按时间byqmnocz1#
使用尚未分配的内存会调用未定义的行为。不要这样做。在所有的可能性中,Linux已经给予了你的程序一页内存,你还没有超过它。如果你碰到了没有分配给你的程序的内存,操作系统应该会导致你的程序段错误。但是,您执行的任何其他
malloc
操作也可能使用该页面的某些部分,最终会损坏数据。不对缓冲区溢出进行运行时检查是使C快速的一部分,但它使程序员更不要做愚蠢的事情。
hm2xizp92#
这并不罕见,当写入内存不属于它的过程悄悄地发生,没有明显的后果。但是有**的后果潜伏。根据this,任何事情都有可能发生,而且最终会发生。
使用在堆上创建的数组来简单说明UB:
字符串
写入不属于您的内存会调用 * undefined behavior. *。不好的一面是,您的结果可能看起来很好,甚至可以重复多次运行代码。但是在某些时候,你的代码会失败。
内存分配示例:(注:cast for malloc() has been removed.)
型
下面的 bad 代码示例可能会导致没有编译器警告,并且可能看起来运行正常,但使用它们将导致有问题的不可预测的行为。
型
创建一个数组:
型
在C++中,你可以创建/使用一个标准的字符串,像这样:
型
除以零会导致未定义的行为:
型
某些指针操作可能会导致未定义的行为:
型
留下一个非空函数而不返回值
型
未指定或实现定义的行为:
型
qvk1mo1f3#
事实上(仅仅因为C中没有边界检查)没有引发错误并不意味着您可以安全地在请求的边界之外使用内存。您很幸运没有引起分段错误,您刚刚落入了一个未被您的
malloc
声明的内存区域(假设它不是您的)。你可以在那里写,但不能保证你不会覆盖分配给另一个
malloc
的内存,或者相反,“额外”的部分不会分配给其他malloc
。在您的情况下,您正在写入的内存区域似乎尚未被声明。