C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分

简介: C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分

题目一

题目描述

//请问代码的运行结果如何?
#include <stdio.h>
#include <stdlib.h>
#include <string.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();
  return 0;
}

题目答案

什么都不打印,且存在内存泄露。

题目分析

代码改正

有两种方法改正:

一: (让GetMemory返回指针,记得释放内存)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* GetMemory(char * p)
{
  p = (char *)malloc(100);
  return p;
}
void Test(void)
{
  char * str = NULL;
  str = GetMemory(str);
  strcpy(str,"hello world");
  printf(str);
  free(str);
  str = NULL;
}
int main()
{
  Test();
  return 0;
}

二:(传址)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char ** p)
{
  *p = (char *)malloc(100);
}
void Test(void)
{
  char * str = NULL;
  GetMemory(&str);
  strcpy(str,"hello world");
  printf(str);
  free(str);
  str = NULL;
}
int main()
{
  Test();
  return 0;
}

题目二

题目描述

//请问代码运行的结果如何?
#include <stdio.h>
 
char* GetMemory(void)
{
  char p[] = {"hello world"};
  return p;
}
void Test(void)
{
  char * str = NULL;
  str = GetMemory();
  printf(str);
} 
int main()
{
  Test();
  return 0;
}

题目答案

打印出随机值,并非hello world。

题目分析

GetMemory函数内部创建的数组是在栈区上的,该函数结束,p数组的空间就还给了操作系统;返回的地址是没有实际的意义的,如果通过返回的地址去访问内存,就是非法访问。

(存放在堆区的话则不会被立刻销毁)

2-1

下面的代码是否出错?

int * func (void)
{
    int * ptr;
    *ptr = 10;
    return ptr;
}

此处的ptr为野指针,没有经过初始化,使用不了。

故而该代码出错。

题目三

题目描述

//请判断代码是否出错?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char ** p,int num)
{
  *p = (char*)malloc(num);
}
void Test(void)
{
  char * str = NULL;
  GetMemory(&str,100);
  strcpy(str,"hello world");
  printf(str);
} 
int main()
{
  Test();
  return 0;
}

题目答案

该代码错误,其忘记释放内存空间。

后加上

即可

题目四

题目描述

//请判断下面代码是否出错?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void Test(void)
{
  char * str = (char*)malloc(100);
  strcpy(str,"hello");
  free(str);
  if(str != NULL)
  {
    strcpy(str,"world");
    printf(str);
  }
} 
int main()
{
  Test();
  return 0;
}

题目答案

出错。str被释放之后还被使用。

题目分析

free函数释放完空间之后是不会帮指针赋值为空,此时再去使用它就会造成非法访问。

所以使用完free函数之后一定要把指针赋为空指针。

C/C++中程序内存区域划分

1.栈区(stack) :在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。钱内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。


2.堆区(heap) : 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。


3.数据段(静态区) ( static):存放全局变量、静态数据。程序结束后由系统释放。


4.代码段:存放函数体(类成员函数和全局函数)的二进制代码。


实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。


但是被static修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序结束才销毁


所以生命周期变长。


目录
相关文章
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
100 4
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
81 2
|
3月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
72 1
|
4月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
175 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
119 0
|
4月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
84 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
2天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)

热门文章

最新文章