据我所知,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;
}
答案 0 :(得分:4)
使用未分配的内存会调用未定义的行为。不要那样做。在所有可能的情况下,Linux已经为您的程序提供了一页内存,而您还没有超越它。如果触摸未分配给程序的内存,操作系统应该导致程序出现段错误。但是,您执行的任何其他malloc
操作也可能会使用该页面的某些部分,最终会破坏您的数据。
没有对超速缓冲区进行运行时检查是使C快速运行的一部分,但它更多地使程序员不要做愚蠢的事情。
答案 1 :(得分:2)
事实上(因为C中没有绑定检查)没有引发错误并不意味着您可以安全地使用请求边界之外的内存。你很幸运不会导致分段错误,你刚刚陷入了malloc
未声明的内存区域(让我们说,这不是你的)。
您可以在那里写,但不能保证您不会覆盖分配给另一个malloc
的内存,或者相反,“额外”部分不会被分配给其他malloc
}。在您的情况下,您正在写入的内存区域似乎尚未声明。
答案 2 :(得分:2)
关于您的具体问题 :,我分配了4个字节但是当我尝试存储4个以上的时,它没有给我任何错误。<登记/> 请记住 ,例如:
int *anyVar = (int)malloc(0);
anyVar[0] = 12; //Will eventually invoke undefined behavior.
写入您不拥有的内存 将最终调用未定义的行为。糟糕的是,您的结果看起来很好,甚至可以重复执行许多代码。但在某些时候,您的代码将失败。
这是你应该如何分配 :(顺便说一下)
int numIntsInArray = 100;
int *anyVar = malloc(sizeof(int)*numIntsInArray);//note:do not cast output of malloc
anyVar[0] = 1;//first element of anyVar
anyVar[99] = 1000;//last element of anyVar
不要忘记释放所有记忆:
free(anyVar);
C&amp; C中未定义行为的其他示例 C ++:
以下不良代码的示例可以完成,您可能不会收到编译器警告,甚至可能会得到 在运行时期间的预期结果,但使用此代码,没有任何保证。 (例外:很好的例子)
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 %d\n", ++n, power(2, n)); //Bad
i = ++i + 1; //Bad
i = i + 1; // Okay