正如我所知,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 bytesn", 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 ` `%in",vector.length,vector.maxLength);
addElement(&vector,5);
addElement(&vector,3);
addElement(&vector,1);
addElement(&vector,7);
printf("The length is %i and maxlength is ` `%in",vector.length,vector.maxLength);
addElement(&vector,51);
printf("The length is %i and maxlength is %in",vector.length,vector.maxLength);
for (int i = 0; i < 200; ++i)
{
addElement(&vector,i);
printf("The length is %i and maxlength is %in" ,vector.length, vector.maxLength);
}
return 0;
}
使用未分配的内存会调用未定义的行为。不要那样做。在所有可能的情况下,Linux已经给你的程序提供了一页内存,而你还没有超过这一页。如果您触摸了未分配给程序的内存,操作系统应该会导致程序发生故障。但是,您所做的任何其他malloc
操作都可能使用该页面的部分内容,最终会损坏您的数据。
没有针对溢出缓冲区的运行时检查是C快速的部分原因,但这让程序员更难做愚蠢的事情。
"我分配了4个字节,但当我尝试存储超过4时,它不会给我任何错误;。
在写入非进程所有的内存时,它会悄悄发生,不会产生明显的后果,这并不罕见。但也存在着的潜在后果。根据这一点,任何事情都有可能发生,并最终发生。
使用在堆上创建的数组来简单说明UB:
int *anyVar = malloc(10 * sizeof(*anyVar));//create space for 10 int
anyVar[10] = 12; //writing to one memory location beyond space allocated
//immediately invoking undefined behavior
写入您不拥有的内存会调用未定义的行为。糟糕的是,您的结果可能看起来很好,甚至对许多代码运行都是可重复的。但在某个时刻,您的代码会失败。
内存分配示例:(注意:已删除malloc()的强制转换。)
int numIntsInArray = 100;
int *anyVar = malloc(sizeof(int)*numIntsInArray);
if(anyVar)//test pointers to memory before using
{
//zero memory before using
memset(anyVar, 0, sizeof(int)*numIntsInArray);
anyVar[0] = 1;//first element of anyVar
anyVar[numIntsInArray-1] = 1000;//last element of anyVar
//Free memory when no longer needed:
free(anyVar);
}
下面的坏代码示例可能不会导致编译器警告,并且可能看起来运行正常,但使用它们会导致有问题的、不可预测的行为。
char * p = "string"; // Badly formed C++11, deprecated C++98/C++03
p[0] = 'X'; // undefined behavior
创建一个数组:
char p[] = "string"; // Good
p[0] = 'X';
C++,您可以创建/使用这样的标准字符串:
std::string s = "string"; // Good
s[0] = 'X';
除以零导致未定义的行为:
int x = 1;
return x / 0; // undefined behavior
某些指针操作可能导致未定义的行为:
int arr[4] = {0, 1, 2, 3};
int* p = arr + 5; // undefined behavior
离开非空函数而不返回值
int func(void)
{
//undefined behavior
}
未指定或实现定义的行为:
printf("%d %dn", ++n, power(2, n)); //Bad
i = ++i + 1; //Bad
i = i + 1; // Okay
事实上(仅仅因为在C中没有绑定检查)没有引发错误并不意味着您可以安全地在请求的边界之外使用内存。你很幸运没有造成分段错误,你只是掉进了一个malloc
没有声明的内存区域(比方说,它不是你的)。
你可以在那里写,但不能保证你不会覆盖分配给另一个malloc
的内存,或者相反,"额外"部分不会分配给其他malloc
。在您的情况下,您正在写入的内存区域似乎尚未被认领。