我只是尝试为 c 字符串分配 10 个字节并打印而没有分配任何东西。我打印了 cstring 的大小。但结果与我想象的完全不同。由于 malloc 只分配原始内存,我认为它会打印任何垃圾值。由于我试图打印 c 字符串的大小,我认为行为应该是未定义的。但我认为它们都打印了空字符这是我的代码。
int main(void)
{
int i;
char * c = (char *)malloc(10);
for(i=0; i<20; ++i)
{
printf("%c.n", *(c+i));
}
return 0;
}
我看到了20行"."谁能解释一下?我在 Linux 下运行它,使用了最新版本的 gcc谢谢
每当 Linux 内核将"新"内存页面映射到您的进程的用户空间时,它都会用零填充此页面,因此您无法找到另一个进程可能留在这些内存地址中的任何数据残留,因为该内存可能属于另一个进程(以及另一个用户)具有秘密数据,例如密码, 键等(如果你有兴趣,内核调用linux/gfp.h中定义的函数unsigned long get_zeroed_page(gfp_t gfp_mask);
)
只要此页面与您的进程相关联,就不会再用零填充页面,因此即使释放了内存,以下代码仍应打印出您之前放置的值:
#include <stdlib.h>
#include <stdio.h>
int main(){
char* test1 = malloc(100);
int i;
for(i=0; i<5; i++){
test1[i] = i+'A';
}
free(test1);
char* test2 = malloc(100);
for(i=0; i<5; i++){
printf("%c.n",test2[i]);
}
return 0;
}
这应该给你以下输出(虽然不能保证):
$ ./a.out
A.
B.
C.
D.
E.
它尚未初始化。需要将其设置为一个值,然后才能看到任何有用的内容。它只是打印了该内存地址中已有的内容(除非设置了一些编译器选项),这很可能只是 0。
如果您正在读取数组,则行为仍应未定义。您的结果只是意味着内存在分配之前存储了"\0"。使用 calloc() 将数组初始化为零。