【问题标题】:C memory allocation affects char array lengthC 内存分配影响 char 数组长度
【发布时间】:2014-11-01 20:02:16
【问题描述】:
#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' 字符,但为什么它的行为不同?

【问题讨论】:

    标签: c arrays memory allocation


    【解决方案1】:
    char *msg = malloc(10000);
    printf("Size: %zu \n", strlen(msg));
    

    msg 已分配,但未初始化,因此调用strlen(msg) 是未定义的行为。

    在您的情况下,也许只是碰巧在malloc分配的未初始化内存中,第一个0出现在不同的地方。

    【讨论】:

      【解决方案2】:

      strlen() 假定一个以 null 结尾的字符串。如果你不初始化你的数组,那么所有的赌注都没有了。这称为"undefined behavior"

      一个简单的解决方法是使用calloc(),它将所有字节初始化为“零”。

      【讨论】:

      • calloc:这也是内存不必要归零的明显案例(将第一个字节设置为0就足够了)。
      【解决方案3】:

      分配和初始化是不同的东西。在您的程序中,您正在分配内存(使用 malloc),但您从未初始化它。 C 语言不保证未初始化的堆空间内存的内容。

      实际上,内存的内容不会是随机的,但它会取你分配之前内存中那个位置的值。但是,不要依赖于您观察到的任何特定行为,因为它可能(并且将会)在每次运行或日常运行中发生变化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2019-11-12
        • 2017-01-03
        • 2015-09-25
        相关资源
        最近更新 更多