手撕大厂出现的过的一些笔试题---------动态内存函数题(一)

简介: 第一题:第一题分析题目程序会崩溃:改正1:(传地址调用)改正2:(返回值接收)

第一题:


//问:下面test函数会输出什么
#Include<stdio.h>
#include<stdlib.h>
void GetMemory(char*p)
{
   p=(char*)malloc(100);
}
void test(void)
{
  char*str=NULL;
  GetMemory(str);
  strcpy(str,"hello world");
  printf(str);
}
int main()
{
    test();
}


第一题分析题目程序会崩溃:


1. GetMemory传参数时是用的传值,我们都知道传值是不会改变函数内部的值的。

  这就导致了在外部用malloc开辟的空间返回的指向地址的指针无法改变test函数里的str指针


2.既然不会改变str指针,那str还是NULL,那么在进行strcpy函数拷贝时,会出现*NULL,

 我们都知道NULL未知的大小位置,所以对NULL解引用是非法操作,所以程序会崩溃。


3.另外一个错误也算是老生常谈的了,用了动态内存函数申请空间没有用free函数释放空间

还要记得将指针置空。


我们既然都知道了错误原因,那么改掉错误也就十分容易了。


改正1:(传地址调用)


//问:下面test函数会输出什么
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char**p)//用二级指针去接收一级指针的地址
{
   *p=(char*)malloc(100);//*p表示的是一级指针的地址(也就是str的地址),将申请好的内存后,
                        // 返回赋值给str,从而使外部的str的值指向了开辟好的首地址。
}
void test(void)
{
  char*str=NULL;
  GetMemory(&str);//传地址就没问题
  strcpy(str,"hello world");//此时str不再是NULL了,而是新申请的首元素地址
  printf(str);//打印出hello world
  free(str);
  str=NULL;//说烂了,不说了,简称一套带走,嘻嘻!!
}
int main()
{
    test();
}


改正2:(返回值接收)


//问:下面test函数会输出什么
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(char*p)
{
  return p = (char*)malloc(100);
}
void test(void)
{
  char*str = NULL;
  str = GetMemory(str);//返回值接收
  strcpy(str, "hello world");
  printf(str); 
  free(str);
  str = NULL;
}
int main()
{
  test();
}


注意:上面的解法中虽然p是局部变量,在栈区上开辟,出了函数,p指针销毁,但动态内存函数申请的空间在堆区,出了函数不会被销毁,且指针p在销毁是已将开辟好的地址传给了str,所以可行。

目录
相关文章
|
4月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
50 3
|
4月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
97 1
|
2月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
102 6
|
4月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
4月前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
68 2
|
4月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
4月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
709 1
|
4月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
4月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作