C 中数组的初始化分配内存的大小

发布于 科技 2024-06-09
9个回答
  1. 匿名用户2024-01-29

    事实上,你的程序的运行结果并不是唯一的,在不同的编译器上,结果可能会有所不同!

    问题在于,所有字符串数组最终都不会以终止符结尾'\0',strlen(),函数根据它计算字符串的长度'\0'以确定字符串的末尾。

    所以你没有给'\0',因此结果完全取决于内存的分配(例如,strlen(c),从 c 的地址开始,当有一个值 0x00 时,即'\0'--,计算完长度,返回结果,这个结果不知道是什么,呵呵)。

    更正:将数组定义更改为:

    char c[4] = ;定义了 4 个元素,应该给所有人!

    char t = ;

    char t2 = ;

    就是这样。

  2. 匿名用户2024-01-28

    最好这样改变它。

    #include

    #include

    #include

    using namespace std;

    void put(string s);

    int main()

    char c[4] = "tao";*字符串的初始值 * char t ="tao";

    char t2 = "taozhi";

    cout cout #include

    #include

    #include

    using namespace std;

    void put(string s);

    int main()

    char c[4] = ;*这里编译器会自动初始化 c[3]0,所以长度是正确的*

    char t = ;* 等价于 t[3],不带字符串终止符,与 * char t2 = 相同;

    cout cout

  3. 匿名用户2024-01-27

    C 语言使用的内存是虚拟内存。 根据功能的不同,虚拟内存在C语言中分为堆栈、堆和静态数据区三类,无论是单个变量还是数组,内存分配都是这样划分的。

    在堆栈、静态数据区和堆区,编译器负责分配,操作系统负责管理,程序员可以在堆中使用malloc()动态分配堆内存。

  4. 匿名用户2024-01-26

    C 语言中有三种类型的内存:堆栈、堆和静态数据。

    局部变量分配在堆栈上,函数调用前的堆栈指针应与函数返回后的堆栈指针相同,否则会发生错误。

    void test(void)

    char i,a[10];

    printf("0x%x", i);

    printf("0x%x", a);

    printf("0x%x", a+1);

    printf("0x%x", a+2);

    printf("0x%x", a+3);

  5. 匿名用户2024-01-25

    整数数组的每个元素都连续存储在内存中,每个整数元素的存储方式取决于计算机硬件。

    1. 数组元素连续存储,地址从低到高。

    例如,字符数组 char a[10];

    有 10 个元素,从 a[0] 到 a[9],地址是连续的。 如果 A 的起始地址是 0x1234,则后续地址是 0x1235、0x1235 等0x123d。

    2.每个元素的具体存储方式取决于CPU。 有两种:

    1. 小端序:

    低序列字节存储在起始地址(低级寻址),地址的低位存储在值的低位,地址的高位存储在值的高点。

    目前大多数 CPU 都以这种方式存储,包括 Intel 和移动设备上最常见的 ARM。

    例如,如果 4 字节整数值0x12345678,它将在内存中存储为:

    0x78 0x56 0x34 0x12

    2.大端序:

    与 little-endian 相比,高序字节存储在起始地址(高级寻址),地址低位存储值的高位,地址高位存储值的低位。

    前面的示例在 big-endian 情况下存储为:

    0x12 0x34 0x56 0x78

  6. 匿名用户2024-01-24

    每个数字占用 4 个字节,地址从低到高,下标为 0 的元素在前,下标为 1 的元素后......依此类推,没有间隔,直到整个数组的末尾。

  7. 匿名用户2024-01-23

    realloc 调用<>需要两个参数。

    此外,需要先检测函数返回的结果,然后才能使用。 如果 realloc 无法申请内存,则返回 null

  8. 匿名用户2024-01-22

    为什么一定要用realloc,用你很熟悉的malloc或者calloc不是很香吗?

  9. 匿名用户2024-01-21

    这说起来有点麻烦,我以前也做过类似的事情,用手打起来并不容易。

    首先,您需要将数组定义为内存堆。

    其次,上面定义的数组是分页的,例如,每页大4个字节的字节,记录每一页的地址,可以定义非常大,管理这些内存所需的内存越大,但也容易造成内存利用率不足。

    3.经过上面的分组,我们可以定义一个结构,它大致包含内存页码、是否被使用过,以及内存分配的唯一标识符(用于区分哪个内存是同一个分配的内存)。

    第四,这时可以编写动态内存分配函数,根据分配的大小,查找未使用的连续内存页。 例如,在第二步中,将一个页面定义为 4 个字节,需要 5 个字节的内存,因此分配了两个页面(额外的 3 个字节将毫无用处,并且会被浪费)。 找到内存页后,将多个内存页标记为已使用,为多个内存页分配相同的内存分配标识符,然后返回第一页的地址。

    5.释放内存,根据内存分配的唯一标识符找到几个内存页,并标记为未使用。

相关回答
10个回答2024-06-09

这些是您绝对应该了解的基本概念:

char a[12];定义了一个字符数组,数组名称是 a,在本例中,a 是指针,它是一个常量类型,其值在数组的整个生命周期内是不可变的。 >>>More

18个回答2024-06-09

mytest->b[2] = ;

这种用大括号括起来的初始化列表形式的初始化只适用于声明和初始化时,并且只对 pod 类型有效。 >>>More

7个回答2024-06-09

对象的初始化是否通常用于初始化列表?

构造函数通常用于对象的初始化。 >>>More

6个回答2024-06-09

静态成员初始化只能在类外部全局完成,不能在类中完成。 >>>More

4个回答2024-06-09

这取决于它的存储方式。

1.在“二补”模式下,10的40次方小于2的133次方,即133位或不超过17字节,可以存储。 >>>More