刚刚由`malloc()`分配的内存是什么?

malloc()用于分配内存空间之后,我很好奇指针究竟保存了什么? 手册页告诉我calloc()用零初始化分配的内存空间。

malloc()函数分配大小字节并返回指向已分配内存的指针。 内存未初始化 。 如果size为0,则malloc()返回NULL或一个唯一的指针值,以后可以成功传递给free()。

calloc()函数为每个大小为字节的nmemb元素的数组分配内存,并返回指向分配内存的指针。 内存设置为零 。 如果nmemb或者size是0,那么calloc()返回NULL,或者返回一个唯一的指针值,以后可以成功传递给free()。

我在C中创建了一个非常简短的示例程序,给C(哈哈)给我自己:

int main() {
    char *dynamic_chars;
    unsigned amount;
    printf("how much bytes you want to allocate?n");
    scanf("%d", &amount);

    dynamic_chars = (char*)malloc(amount*sizeof(char));
    printf("allocated:n%sn", dynamic_chars);

    free(dynamic_chars);
    return 0;

}

但是,执行此代码时,它只输出任何内容。 如果我自己初始化内存,例如使用循环初始化每个单字节为0xFFFF的文件,那么该程序会向我显示我期望的内容。 内存空间实际上存在,因为我不会得到一个错误,声称我试图访问未初始化的变量或如此。

由于内存空间通常不会被删除,而是被标记为可擦写的,所以我不知道是否通过执行我的程序,我不应该能够看到以前使用的内存字节的随机数? 但是我什么都看不到,所以我真的很困惑malloc()是如何工作的。

EDIT1

另一件关于malloc()或一般的内存使用情况,对我的程序来说很有趣:如果我使用calloc()来分配内存,我可以通过监视它来跟踪程序的实际内存使用情况。 例如,如果我告诉我的程序,为每个calloc()分配1.000.000.000字节的内存,我将在我的系统监视器中看到以下内容:

正如你可以想象的那样,当使用malloc() ,我什么也看不到。 我明白,只是通过分配内存,我当时并没有真正使用它,但我仍然对为什么我的操作系统(unix衍生)无法识别它被使用感到困惑。 由于malloc()就像calloc()返回物理地址到内存位置我没有得到,这个内存区域似乎并没有实际上保留的操作系统。 否则,我可以在系统监视器中看到它吗? 如果我宁愿将此作为新问题发布,请告诉我。 但我认为,因为这个问题仍然是关于malloc()如何适用于此的。


不, malloc()返回未初始化的内存,其内容是不确定的。 所以,试图使用该值调用未定义的行为。

引用C11 ,附件§J.2,未定义的行为

使用由malloc函数分配的对象的值

在这种情况下, %s需要一个以null结尾的char数组。 然而, dynamic_chars的内容是不确定的,所以很可能根本不存在空终止符,这将导致超出边界的内存访问,这反过来调用UB。

引用C11章节§7.22.3.5, malloc函数(强调我的):

malloc函数为大小由size指定且值不确定的对象分配空间

这就是说,请参阅为什么不投的返回值这个讨论malloc()在和家人C ..


它在C语言中没有定义,当你得到它时,内存块包含什么。 在实践中,它很可能只包含先前在物理内存中的内容。

如果你的程序以前使用过内存并释放了内存,那么你之前可能会获得内存。 如果它是从操作系统新请求的内存,您将得到操作系统放入的内存。 大多数操作系统都会返回已经专门设置为“零”字节的内存,因为如果内存中仍然包含之前某个其他程序中的内容,那将是一个安全问题。

任何标准都没有保证,这是大多数系统在实践中所做的。


malloc为你分配内存并设置它的指针。 它不以任何方式初始化内存,所以分配的内存区域可以包含任何内容。 由于它不包含字符串,因此您无法通过打印字符串来读取它的内容。 相反,您可以逐字节地打印它,如下所示:

for(int i=0;i<amount*sizeof(char);i++)
{
    printf("%02x", (unsigned)dynamic_chars[i]);
}
链接地址: http://www.djcxy.com/p/82725.html

上一篇: What are the contents of the memory just allocated by `malloc()`?

下一篇: How much memory did Linux give to malloc()?