malloc->分配了多少内存?

时间:2014-02-24 15:11:45

标签: c malloc

据我所知,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 个答案:

答案 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