【c 语言 】malloc函数详解

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏: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语言内存管理方面的学习和实践提供有益的帮助。

这篇文章到这里就结束了

谢谢大家的阅读!

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

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

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FFMPEG C++封装(一)(C++ FFMPEG)

1 概述 FFMPEG是一个C语言开源视音频编解码库。本文将FFMPG4.1.3进行C封装&#xff0c;形成C FFMPG库。 2 架构 架构图如下所示&#xff1a; 架构说明: Init 初始化FFMPEG库。IStream 输入流&#xff0c;FFMPEG的输入音视频文件。Packet 音视频数据包Decoder 音视频编码器F…

字符集 --java学习笔记

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

HarmonyOs开发:轮播图Banner组件封装与使用

前言 轮播图在每个项目中都很常见&#xff0c;鸿蒙中在容器组件中也提供了Swiper组件&#xff0c;用于子组件滑动轮播显示&#xff0c;和前端的使用起来也是异曲同工&#xff0c;我们先看下基本的用法。 Swiper() {ForEach(["1", "2", "3", &quo…

应用案例 | 复合机器人助力智能仓储物流实现高效发展

随着智能仓储物流技术的快速发展&#xff0c;复合机器人作为一种先进的自动化设备&#xff0c;正逐渐在仓储物流领域发挥重要作用。以下是一个复合机器人在智能仓储物流的应用案例。 案例背景 某大型电商企业面临着日益增长的订单量和仓储物流压力。为了提高物流效率、降低人力…

牛角工具箱源码 轻松打造个性化在线工具箱

&#x1f389; Whats this&#xff1f; 这是一款在线工具箱程序&#xff0c;您可以通过安装扩展增强她的功能 通过插件模板的功能&#xff0c;您也可以把她当做网页导航来使用~ 觉得该项目不错的可以给个Star~ &#x1f63a; 演示地址 https://tool.aoaostar.com &#x1f…

手动实现一个扩散模型DDPM

扩散模型是目前大部分AIGC生图模型的基座&#xff0c;其本质是用神经网络学习从高斯噪声逐步恢复图像的过程&#xff0c;本文用python代码从零开始构建了一个简单的扩散模型。 理论部分 DDPM(Denoising Diffusion Probabilistic Models) 是一种在生成对抗网络等技术的基础上发展…

MQTT.fx连接新版OneNet平台的一些问题

对于使用通信主题publish给OneNET时&#xff0c;如图所示&#xff1a; 但是点击Publish后&#xff0c;出现了Broker connection lost的问题 原因在于&#xff1a;新版OneNET和旧版OneNET的通信主题不一致了&#xff0c;查阅文档获知&#xff0c;格式如下&#xff1a; $sys/{p…

二叉树的深度和高度问题-算法通关村

二叉树的深度和高度问题-算法通关村 1 最大深度问题 LeetCode104: 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明&#xff1a;叶子节点是指没有子节点的节点。 对于node&#xff08;3&#xff09;&#xff0…

el-select的错误提示不生效、el-select验证失灵、el-select的blur规则失灵

发现问题 在使用el-select进行表单验证的时候&#xff0c;发现点击下拉列表没选的情况下&#xff0c;他不会提示没有选择选项的信息&#xff0c;我设置了rule如下 <!--el-select--><el-form-item label"等级" prop"level"><el-select v-m…

UE4_碰撞_使用蓝图控制物体移动时如何让被阻挡

当我们这样设置蓝图时&#xff1a; 运行效果&#xff1a; 利用蓝图更改一个物体的位置&#xff0c;发现本来两个应该相互阻挡的物体被穿过去了。为了不让相互阻挡的物体被穿过去&#xff0c;我们需要设置好蓝图节点的参数Sweep。 勾选之后 墙的蓝图我们这样设置&#xff1a; 运…

【Spring】SpringMvc项目当中,页面删除最后一条数据,页面不跳转并且数据为空。

期待您的关注 在之前学习SpringMvc的时候遇到过这样一个BUG&#xff0c;当我在一个页面删除该页面的最后一条数据的时候&#xff0c;一旦我删除成功&#xff0c;那么这个页面不会进行跳转&#xff0c;而是还停留在这个本不应该存在的页面&#xff0c;而且数据什么都没有。如下…

【JavaWeb】Day27.Web入门——Tomcat介绍

目录 WEB服务器-Tomcat 一.服务器概述 二.Web服务器 三.Tomcat- 基本使用 1.下载 2.安装与卸载 3.启动与关闭 4.常见问题 四.Tomcat- 入门程序 WEB服务器-Tomcat 一.服务器概述 服务器硬件&#xff1a;指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算…

Typora for Mac/Win:让Markdown编辑更高效,创作更自由

在数字化时代&#xff0c;文本编辑已成为我们日常生活与工作中的重要环节。Markdown作为一种轻量级标记语言&#xff0c;以其简洁、易读、易写的特性&#xff0c;受到了广大用户的喜爱。而Typora&#xff0c;作为一款专为Markdown设计的文本编辑器&#xff0c;更是让Markdown编…

DBeaver,一款实用的开源数据库管理软件

说起开源软件&#xff0c;其实大部分的体验和服务都是没有商业软件好的&#xff0c;毕竟养团队不是靠鼓励和奉献&#xff0c;咱们选择开源软件的主要原因还是免费&#xff0c;免费&#xff0c;免费。 由于公司限制安装商业软件&#xff0c;咱只能挑开源的替代&#xff0c;其中…

计算机专业在找工作时的注意事项

目录 说在前面关于我一些忠告关于简历关于银行写在最后 说在前面 满满的求生欲。我不是什么大佬&#xff0c;更没有能力教大家什么。只是看到有不少学弟学妹&#xff0c;还在为找一份工作焦头烂额&#xff0c;却没有努力的方向。所以这里斗胆给计算机相关专业的学弟学妹们的一…

如何在 Linux 中查找命令的执行时间

在 Linux 操作系统中&#xff0c;查找命令的执行时间对于优化系统性能、调试程序以及评估脚本效率至关重要。本文将介绍几种方法来准确地测量命令的执行时间。 使用时间命令 时间命令&#xff08;time&#xff09;是一个内置的 shell 命令&#xff0c;用于测量其他命令或程序的…

【日常记录】【JS】getBoundingClientRect 获取元素位置和大小

文章目录 1、介绍2、getBoundingClientRect3、参考链接 1、介绍 getBoundingClientRect() 是一个用于获取元素位置和大小的方法。它返回一个 DOMRect对象&#xff0c;其提供了元素的大小及其相对于视口的位置&#xff0c; 2、getBoundingClientRect 参数&#xff1a;这个方法…

设计模式之代理模式精讲

代理模式&#xff08;Proxy Pattern&#xff09;也叫委托模式&#xff0c;是一个使用率非常高的模式&#xff0c;比如我们在Spring中经常使用的AOP&#xff08;面向切面编程&#xff09;。 概念&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 代理类和实际的主题…

二、Java语法基础

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

PHP 跳转搜索(Jump Search)

与二分搜索一样&#xff0c;跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素&#xff08;比线性搜索&#xff09;。例如&#xff0c;假设我们有一个大小为 n 的数组 arr[] 和一个大小为 m 的块&…