【c 语言 】malloc函数详解

news2024/11/30 7:51:39

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【c 语言 】malloc函数详解

  • 一 malloc函数的功能
    • 1.1动态内存分配
    • 1.2 灵活性
    • 1.3 内存管理
    • 1.4 跨平台兼容性
    • 1.5 与其他内存管理工具的协同工作
    • 1.6 类比
  • 二 malloc函数的工作步骤
    • 2.1 请求内存大小
    • 2.2 检查堆内存状态
    • 2.3 寻找合适的空闲块
    • 2.4 分割空闲块(如果需要)
    • 2.5 分配内存并返回指针
    • 2.6 内存分配失败处理
    • 2.7 维护堆内存状态
    • 2.8 释放内存(通过free函数)
    • 2.9 类比
  • 三 malloc函数的语法
    • 3.1 参数:
    • 3.2 返回值:
  • 四、malloc函数的使用方法
    • 4.1 如何使用`malloc`函数分配指定大小的内存空间。
    • 4.2 如何检查`malloc`函数的返回值(是否成功分配内存)。
    • 4.3 如何使用指针操作分配的内存空间。
  • 五 malloc函数的注意事项
    • 5.1 分配内存后需要手动释放
    • 5.2 避免内存泄漏和野指针
    • 5.3 处理malloc分配内存失败的情况
  • 总结

引言:

在现代软件开发中,内存管理是一个至关重要的环节。在C语言中,malloc函数是实现动态内存分配的关键工具。通过malloc函数,程序员可以在运行时根据实际需求动态地分配内存空间,从而提高了程序的灵活性和可维护性。

本文将详细解析malloc函数的功能、工作步骤、语法、使用方法以及注意事项,帮助读者更好地理解和应用这一强大的内存管理工具

在这里插入图片描述

一 malloc函数的功能

在C语言中,malloc函数的主要作用是动态地分配内存空间

动态地分配内存空间是指在程序运行时,根据实际需求临时申请和释放内存资源的过程,这种方式允许程序更加灵活地管理内存,适应不同大小的数据结构和变化的数据量。

类比: 可以想象你正在准备一场晚会,需要根据到场的嘉宾人数来安排座位。

如果提前固定了座位数量,但到场人数多于预期,就会有人坐不下;反之,如果到场人数少于预期,又会造成座位浪费。

动态地分配内存空间就像是在晚会开始前,根据实际到场人数来安排和调整座位,确保每个嘉宾都有座位坐,同时又不会浪费过多的空间。这种方式既灵活又高效,能够根据实际需求来合理分配资源。

具体来说,malloc允许程序在运行时根据需要申请指定大小的内存块,并返回指向这块内存的指针

返回的指针是这块内存区域的首地址指针(即起始位置的指针),这个指针可以被用来在程序中访问和操作这块内存。

这样,程序就可以在没有预先声明固定大小数组或变量的情况下,灵活地管理内存资源。

以下是malloc函数作用的几个关键方面:

1.1动态内存分配

与在程序编译时就确定大小的静态内存分配(如数组或局部变量)不同,malloc允许程序在运行时根据实际需要动态地分配内存

这意味着你可以根据程序运行时的数据或用户输入来分配不同大小的内存块。

1.2 灵活性

malloc的灵活性体现在它可以分配任意大小的内存块。无论你需要存储一个整数、一个浮点数、一个字符串还是一个复杂的数据结构,只要你知道需要多少字节,你就可以使用malloc来分配内存。

1.3 内存管理

使用malloc分配的内存需要显式地管理

显式地管理通常指的是在编程中,程序员需要明确地指定和操作资源的管理过程,而不是依赖于自动机制或隐含的行为。

在内存管理方面,显式地管理意味着程序员需要手动分配和释放内存,确保资源的正确使用和避免泄漏。

这意味着当你不再需要这块内存时,你必须使用==free函数==来释放它,以避免内存泄漏。

free函数的功能是释放之前通过malloc、calloc或realloc等函数动态分配的内存空间,使其返回给系统,以避免内存泄漏和浪费。调用free后,程序员应确保不再访问已释放的内存,以免出现未定义行为。

同时,你还需要确保在使用这块内存之前和之后,不要访问超出其边界的区域,以避免内存越界错误。

这句话的意思是,在使用通过malloc等函数动态分配的内存块时,程序员必须确保他们的操作严格限制在这块内存的边界之内。换句话说,不能读取或写入超过分配的内存空间的数据

举个例子,如果你通过malloc分配了10个字节的内存,那么你只能安全地访问这10个字节。如果你尝试读取或写入第11个字节或更后面的内存,这就是所谓的“内存越界错误”,它可能会导致程序崩溃或产生不可预料的结果。同样地,尝试访问这块内存的起始位置之前的内存也是不允许的。

1.4 跨平台兼容性

malloc是C标准库中的函数,因此它在不同的操作系统和编译器上都具有良好的兼容性。

这使得使用malloc进行动态内存分配的程序可以很容易地在不同的环境中移植和运行。

1.5 与其他内存管理工具的协同工作

在一些复杂的程序中,可能会使用到其他的内存管理工具或库,如callocrealloc等。这些函数与malloc协同工作,提供了更丰富的内存管理功能。

例如,calloc可以分配指定数量的对象并初始化它们为零,而realloc可以改变已分配内存块的大小。

总的来说,malloc函数在C语言中扮演着至关重要的角色,它使得程序能够更加灵活、高效地管理内存资源,从而支持更复杂的数据结构和算法实现。然而,使用malloc时也需要注意内存管理的细节,以避免出现内存泄漏、越界访问等问题。

1.6 类比

为了更直观地理解C语言中malloc函数的作用,我可以举一个现实生活中的例子来类比。

假设你正在计划一个大型的聚会,需要准备一些桌子和椅子来供客人使用。在这个场景中,malloc函数就相当于你去家具店购买桌子和椅子的过程

1. 动态分配对应现实中的需求变化

就像聚会的规模可能会变化一样(比如突然有更多的朋友想参加),你需要根据实际需要来购买不同数量的桌子和椅子

这就好比malloc允许程序在运行时根据需求动态地分配不同大小的内存块。

2. 灵活性对应现实中的多种选择

在家具店,你可以选择不同尺寸、样式和材质的桌子和椅子,以满足不同的需求。

同样,malloc也允许你根据需要分配任意大小的内存块,无论是存储整数、字符串还是复杂的数据结构。

3. 内存管理对应现实中的资源管理

购买完桌子和椅子后,你需要妥善地管理它们。这意味着在聚会结束后,你需要将不再需要的桌子和椅子存放起来或出售给其他人,以避免占用过多空间

类似地,使用malloc分配的内存也需要显式地管理,通过free函数来释放不再需要的内存块,以避免内存泄漏。

4. 跨平台兼容性对应现实中的通用性

无论是在城市还是乡村,家具店都提供桌子和椅子的销售服务。

类似地,malloc作为C标准库中的函数,在不同的操作系统和编译器上都具有良好的兼容性,使得程序可以在不同的环境中运行。

5. 与其他工具的协同工作对应现实中的团队合作

除了购买桌子和椅子,你可能还需要购买餐具、装饰品等其他物品来完善聚会。这些物品与桌子和椅子一起协同工作,共同打造出一个完美的聚会环境。

同样,在C语言中,malloc也可以与其他内存管理工具(如callocrealloc等)协同工作,提供更丰富的内存管理功能。

通过这个例子,你可以更直观地理解malloc函数在C语言中的作用:它允许程序根据需要动态地分配和管理内存资源,从而支持更复杂的数据结构和算法实现。

二 malloc函数的工作步骤

在C语言中,malloc函数用于动态内存分配,其工作步骤涉及多个层面,包括与操作系统的交互、内存管理策略的应用以及数据结构的维护。以下是malloc函数的工作步骤的详细解释:

2.1 请求内存大小

当程序调用malloc函数时,它首先接收一个参数,即请求分配的内存大小(以字节为单位)

这个大小由程序员根据程序的需求确定。

2.2 检查堆内存状态

malloc函数会检查当前堆内存的状态,包括已分配的内存块和空闲的内存块。

这通常涉及对维护堆内存状态的数据结构(如链表或树)的遍历和查询。

2.3 寻找合适的空闲块

malloc 函数会在空闲内存块中查找一个足够大的块来满足请求的内存大小。这个查找过程可能涉及多种策略,如首次适应、最佳适应或最坏适应等。

根据策略的不同,malloc会选择一个合适的空闲块。

2.4 分割空闲块(如果需要)

如果找到的空闲块比请求的内存大小大malloc会将其分割成两部分:

一部分用于满足当前的内存分配请求,另一部分则作为新的空闲块留待将来使用。这个分割过程需要更新维护堆内存状态的数据结构。

2.5 分配内存并返回指针

一旦找到了合适的空闲块(或分割了空闲块),malloc会将该块标记为已分配状态,并返回指向该块起始地址的指针给调用者。

这个指针可以被用来在程序中访问和操作分配的内存。

2.6 内存分配失败处理

如果malloc无法在堆内存中找到足够大的空闲块来满足请求,或者由于其他原因(如内存耗尽)无法分配内存,它会返回NULL指针

调用者应该检查malloc的返回值,并在返回NULL时采取适当的错误处理措施。

2.7 维护堆内存状态

在成功分配内存后,malloc会更新维护堆内存状态的数据结构,以反映新的内存分配情况。

这包括将已分配的内存块从空闲块列表中移除,并可能更新其他相关信息(如空闲块的大小、位置等)。

2.8 释放内存(通过free函数)

当程序不再需要动态分配的内存时,应该使用free函数来释放它。

free函数会接收一个指向要释放内存的指针作为参数,并将其标记为空闲状态,以便将来可以重新分配。

释放内存后,malloc和其他相关函数可以在需要时再次使用这块内存

这些步骤构成了malloc函数在C语言中动态内存分配的基本工作流程。

需要注意的是,具体的实现细节可能因不同的C语言运行时库和操作系统而有所差异。

此外,为了确保线程安全,在多线程环境中使用mallocfree时可能需要额外的同步机制。

2.9 类比

举一个现实中的例子来类比malloc函数的工作步骤,我们可以将其想象成一个图书馆管理员分配座位给读者的过程。

在这个例子中,图书馆的座位就相当于计算机的内存,而读者则是需要内存的程序

1. 请求内存大小(请求座位数量)

读者(程序)来到图书馆管理员处,告诉管理员他们需要多少个座位(需要多少字节的内存)。

2. 检查座位状态(检查堆内存状态)

图书馆管理员查看当前的座位状态,哪些座位是空的,哪些座位已经被其他读者占用了。

3. 寻找合适的空闲座位(寻找合适的空闲块)

管理员在空座位中查找足够多的连续座位来满足读者的需求。这可能涉及考虑座位的排列和位置,以便最大化座位的利用率。

4. 分配座位(分割空闲块)

如果找到的空闲座位比读者请求的多,管理员可能会将一部分座位划分给其他潜在的读者,留下必要的座位给当前读者。

5. 分配并告知座位位置(分配内存并返回指针)

管理员将分配好的座位标记为已占用,并告诉读者座位的具体位置(返回内存块的起始地址)。

6. 处理座位不足的情况(内存分配失败处理)

如果管理员发现没有足够多的连续空座位来满足读者的需求,他会告知读者座位不足,无法分配(返回NULL指针)。

7. 更新座位状态(维护堆内存状态)

分配完座位后,管理员会更新座位的状态记录,确保座位的分配情况准确无误。

8. 释放座位(释放内存)

当读者离开图书馆时,他们需要将座位归还给管理员。管理员将座位标记为空闲状态,以便其他读者或未来的分配请求可以使用。

这个例子虽然简化了malloc函数的实际工作细节,但它提供了一个直观的方式来理解动态内存分配的基本过程和步骤。就像图书馆管理员需要高效地管理座位资源一样,malloc函数也需要高效地管理计算机的内存资源,以满足程序的需求。

三 malloc函数的语法

malloc 函数是 C 语言中用于动态内存分配的标准库函数,它属于 <stdlib.h> 头文件。malloc 的基本语法如下:

#include <stdlib.h>

void *malloc(size_t size);

3.1 参数:

  • size:这是一个 size_t 类型的参数,它表示要分配的内存块的大小(以字节为单位)。这个值是由程序员根据程序的需求来确定的,通常是一个整数常量或者通过计算得出的结果。

3.2 返回值:

  • 如果内存分配成功,malloc 返回一个指向所分配内存块的指针,该指针的类型是 void *,意味着它可以被转换为任何类型的指针。

程序员通常会将这个 void * 类型的指针强制转换为所需数据类型的指针,以便后续使用。

  • 如果内存分配失败(比如由于内存耗尽),malloc 会返回 NULL 指针。

因此,在调用 malloc 后,必须检查返回的指针是否为 NULL,以避免在空指针上解引用而导致的程序崩溃。

四、malloc函数的使用方法

当使用malloc函数来分配内存时,你需要遵循一定的步骤来确保内存被正确分配、使用和释放。下面将逐一介绍这些步骤:

4.1 如何使用malloc函数分配指定大小的内存空间。

首先,你需要包含stdlib.h头文件,该头文件包含了malloc函数的声明。然后,你可以调用malloc函数并传递你想要分配的内存大小(以字节为单位)。

代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 假设我们要分配一个包含10个整数的数组所需的内存空间
    size_t num_elements = 10;
    size_t size = num_elements * sizeof(int); // 计算所需的总字节数

    // 使用malloc分配内存
    int *array = (int *)malloc(size);

    // ... 在这里使用array指针进行操作 ...

    // 最后,释放内存
    free(array);

    return 0;
}

代码分析:

这段代码主要演示了如何在C语言中使用malloc函数动态分配内存,并在使用完毕后释放内存。

以下是对代码每个步骤的分析:

首先,代码包含了stdio.hstdlib.h两个头文件,分别用于标准输入输出和内存管理函数的声明。

然后,在main函数中,定义了一个size_t类型的变量num_elements,并赋值为10,表示要分配的整数数组的元素个数。

接着,使用sizeof(int)计算一个整数所占用的字节数,然后乘以num_elements,得到整个数组所需的内存大小,并将结果存储在size变量中。

随后,调用malloc函数,并传入size作为参数,以动态分配所需的内存空间。malloc函数返回一个指向分配的内存的指针,该指针被强制类型转换为int *类型,并赋值给array变量。

array指针被成功赋值后,可以使用该指针来访问和操作分配的内存空间,比如给数组元素赋值、读取数组元素等。

最后,使用free函数释放array指针所指向的内存空间,以避免内存泄漏。

整个程序在执行完毕后返回0,表示程序正常结束。

需要注意的是,在实际编程中,应该检查malloc函数的返回值是否为NULL,以确保内存分配成功。如果malloc返回NULL,则表示内存分配失败,应该进行相应的错误处理。

4.2 如何检查malloc函数的返回值(是否成功分配内存)。

在调用malloc后,你应该立即检查返回的指针是否为NULL。如果返回NULL,则表示内存分配失败,可能是因为内存不足。

代码:

int *array = (int *)malloc(size);
if (array == NULL) {
    // 内存分配失败,处理错误
    fprintf(stderr, "Memory allocation failed\n");
    return 1; // 或采取其他错误处理措施
}

代码分析:

这段代码的主要步骤包括动态内存分配、错误检查以及错误处理。

首先,通过调用malloc函数并传入size参数来动态分配指定大小的内存,并将返回的指针强制转换为int *类型,赋值给array指针。

接下来,使用if语句检查array指针是否为NULL。如果arrayNULL,表示内存分配失败。

在内存分配失败的分支中,通过fprintf函数向标准错误流stderr输出错误信息“Memory allocation failed”,告知用户内存分配失败。

最后,通过return 1语句返回错误码,表示程序因为内存分配失败而异常终止。在实际应用中,可以根据具体需求采取其他错误处理措施。

4.3 如何使用指针操作分配的内存空间。

一旦你成功地分配了内存,你就可以通过返回的指针来访问和操作这块内存。在上面的例子中,array是一个指向整数的指针,你可以像操作普通数组一样操作它。

代码:

// 假设内存分配成功
for (size_t i = 0; i < num_elements; ++i) {
    array[i] = i; // 给数组的每个元素赋值
}

// 打印数组内容
for (size_t i = 0; i < num_elements; ++i) {
    printf("%d ", array[i]);
}
printf("\n");

代码分析:

这段代码主要包含两个步骤:

首先,通过一个for循环遍历整个数组,并使用array[i] = i;给数组的每个元素依次赋值。这里,i从0开始递增,直到达到num_elements - 1,从而确保数组的每一个位置都被赋予一个从0开始的连续整数。

然后,通过另一个for循环再次遍历数组,并使用printf函数将每个元素的值打印到标准输出。在每次迭代中,printf都会输出当前元素的值和一个空格,直到打印完所有元素。最后,通过printf("\n");输出一个换行符,使得打印的数组内容整齐地显示在一行之后。

整个代码段实现了对动态分配内存的数组进行初始化和内容展示的功能。

请注意,在使用完分配的内存后,一定要调用free函数来释放它,以避免内存泄漏。

// 释放内存
free(array);

在释放内存后,应该将指向该内存的指针设置为NULL,以避免悬挂指针(dangling pointer)的问题,即指针仍然指向已经被释放的内存。

// 将指针设置为NULL,避免悬挂指针
array = NULL;

这样,你就可以确保不会再次错误地访问已经被释放的内存,从而避免潜在的程序崩溃或数据损坏。

总结来说,使用malloc函数分配内存需要谨慎处理,确保检查返回值、正确操作内存并在不再需要时释放内存。

五 malloc函数的注意事项

malloc函数是C语言标准库中的一个函数,用于在堆上动态分配指定大小的内存。使用malloc函数时,需要特别注意以下几点:

5.1 分配内存后需要手动释放

malloc函数分配的内存块在程序结束前必须手动释放,否则会导致内存泄漏。可以使用free函数来释放之前通过malloc分配的内存。这是使用malloc的一个基本和重要的原则。

int *array = (int *)malloc(sizeof(int) * num_elements);
if (array != NULL) {
    // 使用array...
    free(array); // 使用完毕后释放内存
}

5.2 避免内存泄漏和野指针

内存泄漏:如果分配的内存没有被释放,那么这块内存就会一直被占用,即使程序不再需要它。长时间的内存泄漏可能会导致系统资源耗尽,甚至引发程序崩溃。

野指针:如果一个指针指向的内存已经被释放,但这个指针没有被设置为NULL,那么这个指针就变成了野指针。使用野指针会导致不可预知的行为,通常是程序崩溃。

为了预防这些问题,可以采取以下措施:

  • 每次调用malloc后,都检查返回的指针是否为NULL,以确保内存分配成功。
  • 在释放内存后,立即将指针设置为NULL,以防止使用野指针。
  • 遵循良好的编程习惯,只在必要时分配内存,并在不再需要时及时释放。

5.3 处理malloc分配内存失败的情况

malloc在无法分配所需内存时会返回NULL。这通常发生在系统内存不足时。为了处理这种情况,应该总是检查malloc的返回值。

int *array = (int *)malloc(sizeof(int) * num_elements);
if (array == NULL) {
    // 内存分配失败,处理错误
    fprintf(stderr, "Memory allocation failed\n");
    exit(EXIT_FAILURE); // 终止程序
}

在这个例子中,如果malloc返回NULL,程序会打印一个错误消息,并使用exit函数终止。当然,具体的错误处理方式取决于你的应用程序需求。例如,在某些情况下,你可能希望尝试使用更小的内存块,或者通知用户并尝试恢复。但无论如何,你都应该确保程序不会因为无法分配内存而进入不稳定状态。

总结

通过本文的详细解析,我们深入了解了C语言中malloc函数的功能、工作步骤、语法、使用方法以及注意事项。

malloc函数作为动态内存分配的关键工具,为程序员提供了极大的灵活性和便利性。然而,在使用malloc函数时,我们也需要注意一些重要事项,如手动释放分配的内存、避免内存泄漏和野指针以及正确处理内存分配失败的情况。

只有正确理解和应用这些知识点,我们才能有效地利用malloc函数,写出高效、稳定、安全的C语言程序。希望本文能对读者在C语言内存管理方面的学习和实践提供有益的帮助。

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1555873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

密码学基础-对称密码/公钥密码/混合密码系统 详解

密码学基础-对称密码/公钥密码 加解密说明1.加密解密必要因素加密安全性说明 什么是对称密码图示说明对称密码详解什么是DES?举例说明 什么是3DES什么是AES? 公钥密码什么是RSA? 对称密钥和公钥密码优缺点对比对称密码对称密码算法总结对称密码存在的问题? 公钥密码公钥密码…

真实工作中的编程,与在校coder有哪些不同?

工作中的编程和学校里最大的不同在于&#xff1a;在完整的流程规范下&#xff0c;同事间协同开发&#xff0c;按时按量交付&#xff0c;并不断测试迭代优化&#xff0c;最终能稳定的用于生产。 有人说这是软件开发&#xff0c;并不是编程啊。对这就是工作编程和学校编程的差异…

pdf在浏览器上无法正常加载的问题

一、背景 觉得很有意思给大家分享一下。事情是这样的&#xff0c;开发给我反馈说&#xff0c;线上环境接口请求展示pdf异常&#xff0c;此时碰巧我前不久正好在ingress前加了一层nginx&#xff0c;恰逢此时内心五谷杂陈&#xff0c;思路第一时间便放在了改动项。捣鼓了好久无果…

字符集 --java学习笔记

字符集 为了将字符存进计算机&#xff0c;所以有了字符集 标准ASCI字符集 ASCl(American standard Code for Information Interchange):美国信息交换标准代码&#xff0c;包括了英文、符号等标准ASCI使用1个字节存储一个字符&#xff0c;首尾是0&#xff0c;总共可表示128个…

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…

二、Java语法基础

1、Java语言的关键字、标识符及命名规范 1)java关键字 2)标识符 3)JAVA中的命名规范 包名的命名规范:域名.公司名称.项目名称.模块名称 类的命名规范:首字母大写,第二个单词的首字母大写,以此类推。 2、进制间的转换(二进制、十进制) 1)十进制->二进制 采用…

深入探讨Docker in Docker:原理与实战指南

在软件开发和部署中&#xff0c;容器化技术已经成为一个不可或缺的工具。而在使用Docker进行容器化时&#xff0c;有时可能会遇到需要在一个Docker容器中运行另一个Docker容器的情况&#xff0c;这就是所谓的"Docker in Docker"&#xff08;简称DinD&#xff09;。本…

新能源充电桩站场视频汇聚系统建设方案及技术特点分析

随着新能源汽车的普及&#xff0c;充电桩作为新能源汽车的基础设施&#xff0c;其安全性和可靠性越来越受到人们的关注。为了更好地保障充电桩的安全运行与站场管理&#xff0c;TSINGSEE青犀&触角云推出了一套新能源汽车充电桩视频汇聚管理与视频监控方案。 方案采用高清摄…

先进电气技术 —— 储能系统技术原理是什么?有哪些技术发展点?

一、储能系统基本原理 储能系统是一种能够存储电能并在需要时释放电能的技术装置。在电力系统、可再生能源利用、电力供需调节等领域&#xff0c;储能系统扮演着至关重要的角色。其工作原理主要包括以下几个步骤&#xff1a; 1. **充电阶段**&#xff1a; - 当电力供应充足…

通义千问7B大模型微调

阿里云机器学习试用 登录阿里云&#xff0c;搜索PAI和NAS申请试用即可&#xff0c;都是三个月 工作空间创建好了之后再来创建实例&#xff0c;所谓的实例也即我们运行的云服务器的节点。由于云服务器通常基于虚拟化容器部署&#xff0c;所以会被称为实例&#xff0c;简单…

黑马程序员 Java 入门 笔记

一、基础概念 注释和关键字字面量&#xff1a;告诉程序员数据在程序中书写格式 分类&#xff1a;整数、小数、字符、字符串、布尔、空 特殊字面量&#xff1a;制表符 ‘\t’ 空null(加" "才能输出) 变量 加减法数据存储 数据类型 基本数据类型 整数浮点数字符布尔…

硬件17、PCB在机械层确定板子大小和形状以及后续拓宽板子

确定板子的形状和大小 (1)在机械层用线画出板子的形状和大小&#xff0c;然后全选中线&#xff0c;然后设计-》板子形状-》按照选择对象定义 这就是确定板子的原点 板子的形状大小规划一定是在机械层 在机械层使用直线画出想要的板子形状 设置这段线为2cm&#xff0c;也就…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

redis集群配置(精华版):主从复制模式

主从复制模式 概念&#xff1a;作用&#xff1a;为什么使用集群&#xff1a;动手实操1、环境准备2、配置redis.conf配置文件3、再次查看主从节点信息4、验证主从模式 概念&#xff1a; ​ 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器…

Java基础语法(三)| 循环语句

前言 Hello&#xff0c;大家好&#xff01;很开心与你们在这里相遇&#xff0c;我是一个喜欢文字、喜欢有趣的灵魂、喜欢探索一切有趣事物的女孩&#xff0c;想与你们共同学习、探索关于IT的相关知识&#xff0c;希望我们可以一路陪伴~ 1. if语句 1.1 格式一 if (关系表达式) …

Halcon3D表面平面度检测-平面差值法

//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179 //平面度和平面缺陷检测&#xff0c;平面矫正法 https://blog.csdn.net/m0_51559565/article/details/137163729前言 通常我们对表面平面度进行检测时&#xff0c;通常使用2种方式。1&#xff1a…

【目录整理】(五)

​​​​​Git 基础 Git 详细安装教程文章浏览阅读10w次&#xff0c;点赞9.6k次&#xff0c;收藏1.7w次。Git 是个免费的开源分布式版本控制系统&#xff0c;下载地址为git-scm.com 或者 gitforwindows.org&#xff0c;本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…

Linux网络配置(超详细)

Linux网络配置大全 Linux网络配置一.网络地址配置网络地址查看–ifconfig使用网络配置命令设置网络接口参数-ifconfig禁用(临时)或者重新激活网卡设置虚拟网络接口 修改网络配置文件网络接口配置文件 IP命令详解OPTIONS选项OBJECT对象 ip link 二、获取和修改主机名hostname查看…

如何在OceanBase的OCP多节点上获取日志

背景 在使用OceanBase的OCP的过程中&#xff0c;因各种因素&#xff0c;我们可能需要对当前页面进行跟踪。在单一ocp节点环境下&#xff0c;我们自然可以直接在该节点上查找所需的日志。然而&#xff0c;当我们的环境中部署了多个ocp节点时&#xff0c;在排查问题时就会变得相…

QA:绑定ROS机器人控制板PCB设备ID

前言 一般情况下&#xff0c;主控板(树莓派、Jetson等)会同时和多个串口进行通信&#xff0c;这时&#xff0c;我们希望&#xff0c;用一个固定名称代表特定串口&#xff0c;比如用serial_motor_drive绑定电机驱动控制板&#xff0c;使ROS2的配置、编程和运行更加方便。 下面是…