C内存分配会影响char数组长度

时间:2014-11-01 20:02:17

标签: c arrays memory allocation

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

有人可以解释一下:

  • 如果我同时执行步骤1和2,则msg的长度将为6,有时为4
  • 如果我执行第1步和第2步,但没有分配和释放密钥,则长度为0
  • 如果我只执行第2步,则msg的长度将为0

为什么int和key数组的分配会影响char数组的长度? 我意识到strlen需要'\ 0'字符,但为什么它表现不同?

3 个答案:

答案 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语言不保证未初始化的堆空间内存的内容。

实际上,内存的内容不会是随机的,但是在分配它之前,它将占用内存中该位置的值。但是,不要依赖于您观察到的任何特定行为,因为它可能(并且将会)从一次运行或从一天到另一天发生变化。