malloc->分配了多少内存?[副本]

njthzxwz  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(88)

此问题在此处已有答案

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;
    }

byqmnocz

byqmnocz1#

使用尚未分配的内存会调用未定义的行为。不要这样做。在所有的可能性中,Linux已经给予了你的程序一页内存,你还没有超过它。如果你碰到了没有分配给你的程序的内存,操作系统应该会导致你的程序段错误。但是,您执行的任何其他malloc操作也可能使用该页面的某些部分,最终会损坏数据。
不对缓冲区溢出进行运行时检查是使C快速的一部分,但它使程序员更不要做愚蠢的事情。

hm2xizp9

hm2xizp92#

  • “我分配了4个字节,但当我尝试存储超过4* 时,它不会给我错误"。

这并不罕见,当写入内存不属于它的过程悄悄地发生,没有明显的后果。但是有**的后果潜伏。根据this,任何事情都有可能发生,而且最终会发生。
使用在堆上创建的数组来简单说明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

字符串
写入不属于您的内存会调用 * undefined behavior. *。不好的一面是,您的结果可能看起来很好,甚至可以重复多次运行代码。但是在某些时候,你的代码会失败。
内存分配示例:(注:cast for malloc() has been removed.

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);
}


下面的 bad 代码示例可能会导致没有编译器警告,并且可能看起来运行正常,但使用它们将导致有问题的不可预测的行为。

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

qvk1mo1f

qvk1mo1f3#

事实上(仅仅因为C中没有边界检查)没有引发错误并不意味着您可以安全地在请求的边界之外使用内存。您很幸运没有引起分段错误,您刚刚落入了一个未被您的malloc声明的内存区域(假设它不是您的)。
你可以在那里写,但不能保证你不会覆盖分配给另一个malloc的内存,或者相反,“额外”的部分不会分配给其他malloc。在您的情况下,您正在写入的内存区域似乎尚未被声明。

相关问题