#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
//Step 1
char *key = malloc(10000);
int *arr = malloc(sizeof(int));
free(arr);
free(key);
//Step 2
char *msg = malloc(10000);
printf("Size: %zu \n", strlen(msg));
free(msg);
return 0;
}
有人可以解释一下:
为什么int和key数组的分配会影响char数组的长度? 我意识到strlen需要'\ 0'字符,但为什么它表现不同?
答案 0 :(得分:4)
char *msg = malloc(10000);
printf("Size: %zu \n", strlen(msg));
msg
已分配但未初始化,因此调用strlen(msg)
是未定义的行为。
在您的情况下,也许恰好发生在malloc
分配的未初始化内存中,第一个0
出现在不同的地方。
答案 1 :(得分:1)
strlen()假定以空字符结尾的字符串。如果你没有初始化你的阵列,那么所有的赌注都会被取消。这称为"undefined behavior"。
一个简单的解决方法是使用calloc(),它将所有字节初始化为“零”。
答案 2 :(得分:1)
分配和初始化是不同的事情。在你的程序中,你正在分配内存(使用malloc),但你永远不会初始化它。 C语言不保证未初始化的堆空间内存的内容。
实际上,内存的内容不会是随机的,但是在分配它之前,它将占用内存中该位置的值。但是,不要依赖于您观察到的任何特定行为,因为它可能(并且将会)从一次运行或从一天到另一天发生变化。