C语言程序编写涉及内存的问题

在平常的C语言程序编写中往往都会涉及内存的问题,下面分享一些常见的问题范例及相关解答,可以学习IT500强面试官谈算法面试题

void GetMemory(char *p)

{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, “hello world”);
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, “hello world”);将使程序崩溃。
char *GetMemory(void)
{
char p[] = “hello world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:可能是乱码。
因为GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, “hello”);
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:(1)能够输出hello;(2)内存泄漏

void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预
料,非常危险。
因为free(str);之后,str 成为野指针,
if(str != NULL)语句不起作用。

学习更多编程语言教程请登录e良师益友网。

时间: 2024-10-30 03:44:17

C语言程序编写涉及内存的问题的相关文章

C语言程序编译的内存分配

C语言程序编译的内存分配: 1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { i

【C语言】C语言程序所占内存分类

参考"http://blog.sina.com.cn/s/blog_63d4849c01014qg3.html" C语言内存分为5部分:堆.栈.全局(静态)区.常量区(只读)和代码区. 堆,需要人工申请和释放内存,其他均为系统自动释放. 全局(静态)区.常量区:全局可见! #include <stdio.h> #include <malloc.h> int a=0;//初始化全局变量,存在“全局(静态)区(data)初始化”中,程序结束后由系统释放 char *

浅谈c语言程序为什么需要内存 栈又是什么?

1 1.关于内存(程序的执行需要内存的支持) 2 (1)内存本身在物理上是硬件器件,由操作系统提供 3 (2)内存的管理最终由操作系统统一管理.为了能过便捷的管理内存(酒店管理房间 是不是分很多不同的类型和待遇呢),同样操作系统提供了多种的机制来让了多种机制来让我们应用程序使用内存.这些机制彼此不同,各自有各自的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限).使用内存.释放内存(向操作系统归还这块内存的使用权限).也就是在进入酒店拿到钥匙或者卡,

C语言程序编写中犯的错误的记录(一)

今天学习用到了<C程序设计(第四版)>的求两个数的最大值的程序devcpp程序:#include <stdio.h>int main(){int max(int x,int y);int a,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d\n",c);system("pause");return 0;}int max(int x,int y){int z

C语言程序的内存布局

一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段(Code or Text): 代码段由程序中的机器码组成.在C语言中,程序语句进行编译后,形成机器代码.在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行. 2.只读数据段(RO data): 只读数据段是程序使用的一些不会被更改的数据,使用这些数方式类似查表式的操作,由于这些变量不需要更改

2.C语言------程序运行为什么需要内存2

C语言------程序运行为什么需要内存(二) 1.代码就是函数.C语言中全局变量和局部变量就是数据. 2.在运行应用程序时,所有应用程序的代码和数据都在DRAM中就是冯诺依曼结构. 3.在单片机中将程序烧写到Flash(NorFlash)中,然后程序在Flash中运行.如果程序运行过程中不需要处理数据,那么这个这个程序也就不需要内存.程序中涉及到的数据(全局变量或局部变量)不能再Flash中必须放到RAM(SRAM:内存)中.CPU从Flash中读取程序并运行该程序,Flash中的程序只会被读

[Linux内核分析第一周课程] 由C语言程序的汇编表示观察CPU寄存器与内存的互动

孟宁<Linux内核分析>第一周实验 作者:Zou Le 原创作品转载请注明出处. 课程信息: <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ---------------------------实验正文--------------------------- 本实验在实验楼64位LIinux虚拟机下进行. C代码如下: int increment5(int x) { return x + 5; }

编写一个删除c语言程序文件中所有的注释语句

//删除c语言程序中所有的注释语句,要正确处理带引号的字符串与字符串常量 #include <stdio.h> using namespace std; #define MAXLINE 1000 void rcomment(int c); void in_comment(void); void deleteTail(void); FILE* fp; FILE* fp2; int main() { fp=fopen("C:\\Users\\Administrator\\Desktop\

C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.下面实现: 整数向字符串的转换,返回字符串指针,并在main函数中调用printf显示. #include<stdio.h> #include<stdlib.h> #include<string.h> char* swich(int n) { char A[20],B[20]; char*p;//=(char*)malloc(4*sizeof(char)); int i=0,a; int minus=0;