malloc和free

怎样使用malloc和free函数,输入n和n个整数,并且输出最大值,最小值

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

int main() {
    int n, i, *arr;
    int max, min;

    // 输入n
    printf("请输入n: ");
    scanf("%d", &n);

    // 动态分配n个整数大小的内存空间
    arr = (int*) malloc(n * sizeof(int));

    // 输入n个整数
    printf("请输入%d个整数: ", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 初始化max和min
    max = min = arr[0];

    // 查找最大值和最小值
    for (i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
    }

    // 输出最大值和最小值
    printf("最大值为:%d\n", max);
    printf("最小值为:%d\n", min);

    // 释放内存空间
    free(arr);

    return 0;
}

  • 这篇博客也许可以解决你的问题👉 :C语言malloc函数解释和calloc函数,free()
  • 除此之外, 这篇博客: C语言库函数malloc和free介绍中的 malloc和free函数介绍 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • C语言提供了一个动态内存开辟的函数:

    void* malloc (size_t size);

    这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

    • 如果开辟成功,则返回一个指向开辟好空间的指针。
    • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
    • 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
    • 如果size为0,malloc的行为是标准未定义的,取决于编译器。

    举个例子:

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	//int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    	//申请空间
    	int* p = (int*) malloc(40);
    	if (p == NULL)
    	{
    		return -1;
    	}
    	//开辟成功了
        int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		*(p + i) = i;
    		printf("%d ", *(p + i));
    	}
    	return 0;
    }

    C语言提供了另外一个函数free,是专门用来做动态内存的释放和回收的:

    void free (void* ptr);

    free函数用来释放动态开辟的内存。

    • 如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。
    • 如果参数ptr是NULL指针,那函数什么事情都不做。

    举个例子:

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	//int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    	//申请空间
    	int* p = (int*) malloc(40);
    	if (p == NULL)
    	{
    		return -1;
    	}
    	//开辟成功了
        int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		*(p + i) = i;
    		printf("%d ", *(p + i));
    	}
    	//释放空间
    	free(p);
    	p = NULL;
    	return 0;
    }

    注明:malloc() 和 free() 的头文件都是 #include <stdlib.h> 千万别忘了哦~

  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n, i, max, min;
        int *data;
        printf("请输入数的个数:\n");
        scanf("%d", &n);
        data = (int *)malloc(n * sizeof(int)); // 申请连续内存块
        if (data == NULL) { // 判断内存是否申请成功
            printf("内存申请失败!\n");
            exit(1); // 退出程序
        }
        printf("请输入数:\n");
        for (i = 0; i < n; i++) {
            scanf("%d", &data[i]);
        }
        max = data[0]; // 假设第一个数为最大值
        min = data[0]; // 假设第一个数为最小值
        for (i = 1; i < n; i++) { // 遍历寻找其他数中的最值
            if (data[i] > max) {
                max = data[i];
            }
            if (data[i] < min) {
                min = data[i];
            }
        }
        printf("最大值:%d,最小值:%d\n", max, min);
        free(data); // 释放内存
        data = NULL; // 指针设置为空,防止野指针
        return 0;
    }
    

    解决思路: 1. 首先需要使用 malloc 函数动态申请连续内存块,由于需要输入 n 个整数,需要申请 n 个 int 类型的内存空间,所以 malloc 的参数应为 n * sizeof(int)。 2. 判断内存申请是否成功,如果申请失败,记录错误信息并退出程序。 3. 输入 n 个整数并存放到申请的内存空间中。 4. 假设第一个数为最大值和最小值,遍历其他数,如果找到更大或更小的数,则更新最大值或最小值。 5. 输出最大值和最小值。 6. 释放申请的内存,并将指针设置为空,防止野指针。