C语言 (内存) 四道经典题目

 1 void GetMemory(char *p)
 2 {
 3 p = (char *)malloc(100);                 "没有释放内存"
 4 }
 5 void Test(void)
 6 {
 7 char *str = NULL;
 8 GetMemory(str);
 9 strcpy(str, "hello world");             "str 指针没有任何变化(值传递),还是指向NULL,没有内存,对NULL的空间进行操作,编译器会报段错误"
10 printf(str);
11 }
12 请问运行Test函数会有什么样的结果?简述原因 .
13
14 char *GetMemory(void)
15 {
16 char p[] = "hello world";                 "栈上的内存,程序结束内存就析构"。
17 return p;
18 }
19 void Test(void)
20 {                                        "只有地址,没有内存,输出时乱码,看编译器的处理(有的编译器会报段错误)"
21 char *str = NULL;
22 str = GetMemory();
23 printf(str);
24 }
25 请问运行Test函数会有什么样的结果?简述原因
26
27 void GetMemory(char **p, int num)
28 {
29 *p = (char *)malloc(num);
30 }
31 void Test(void)
32 {
33 char *str = NULL;
34 GetMemory(&str, 100);                     "正常输出,但是内存没有释放,内存泄漏"。
35 strcpy(str, "hello");
36 printf(str);
37 }
38 请问运行Test函数会有什么样的结果?简述原因
39
40 void Test(void)
41 {
42 char *str = (char *) malloc(100);
43 strcpy(str, “hello”);
44 free(str);
45 if(str != NULL)
46 {                                         "只有地址,没有内存,但是由于在同一个函数中,上一个地址中的内存可能还没有被其他程序占用,"
47                                           " 所以拷贝时不会出段错误,而且正常打印,但是程序结束时会报段错误"
48 strcpy(str, “world”);
49 printf(str);
50 }
51 }
52 请问运行Test函数会有什么样的结果?简述原因,应如何避免。 
时间: 2024-12-14 05:34:02

C语言 (内存) 四道经典题目的相关文章

评:C语言18个经典问题答录

C语言18个经典问题答录这个大家都看过,自己也仔细看了一遍,另外,将一点感悟加注了一下. 1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示"非法初始式" 云云. 答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中.因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行时确定的. 评:gcc编译不会报错.但是这样的编程习惯确实不好,即使知道需要内存大小,一般也是使用宏定义来标识需要

C语言100个经典算法源码片段

将写内容过程中比较常用的内容备份一次,下边内容段是关于C语言100个经典算法片段的内容. C语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数 为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 程序源代码: main() { long

矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

https://www.vijos.org/p/1067 很容易推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵,其中右上角的(k-1)*(k-1)的矩阵是单位矩阵,第k行的每个数分别对应f[n-1],f[n-2],,f[n-k]的系数.然后构造一个k*1的矩阵,它的第i行代表f[i],是经过直接递推得到的.设ans[][]是第一个矩阵的n-k次幂乘上第二个矩阵,f[n]就是ans[k][1]. 注意:用__int64 #in

c语言内存四区模型

c语言内存四区模型:代码区,全局区(常量区),栈区,堆区 在全局区(常量区),两个字符串完全一样c++编译器只会定义一份 char * getBuf() { char buf[20]; strcpy(buf, "abcde"); return buf; } abcdX?  有乱码! 确实把内存地址返回了,但不能用 被调函数调用完毕,在临时区分配的内存统统消失 char *buf= (char *)malloc(sizeof(char)*20); 手动malloc申请一份内存,由程序员手

学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足结合律经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转    这 里的操作是对所有点同时进行的.其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心.如果对每个点分别进行模拟,那么m个操作总共耗时 O(mn).利用矩阵乘法可

十个利用矩阵乘法解决的经典题目

转载自    Matrix67: The Aha Moments 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个

C语言内存调试技巧—C语言最大难点揭秘

本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划.但好消息是,它们并不怎么神秘.引言C 和 C++ 程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果.来自计算机应急响应小组(请参见参考资料)和供应商的许多最严重的安全公告都是由简单的内存错误造成的.自从 70 年代末期以来,C 程序员就一直讨论此

[leetcode]53Maximum Subarray动态规划经典题目:最大子串问题

/** * Find the contiguous subarray within an array (containing at least one number) * which has the largest sum. For example, given the array [-2,1,-3,4,-1,2,1,-5,4], the contiguous subarray [4,-1,2,1] has the largest sum = 6. click to show more prac

C语言内存使用的常见问题及解决之道

一  前言 本文所讨论的“内存”主要指(静态)数据区.堆区和栈区空间(详细的布局和描述参考<Linux虚拟地址空间布局>一文).数据区内存在程序编译时分配,该内存的生存期为程序的整个运行期间,如全局变量和static关键字所声明的静态变量.函数执行时在栈上开辟局部自动变量的储存空间,执行结束时自动释放栈区内存.堆区内存亦称动态内存,由程序在运行时调用malloc/calloc/realloc等库函数申请,并由使用者显式地调用free库函数释放.堆内存比栈内存分配容量更大,生存期由使用者决定,故