C语言返回类型为指针的一些经典题目(下)

简介: C语言返回类型为指针的一些经典题目(下)

续上一篇文章,上一篇文章题目都很经典,这一篇也不例外。

一.返回类型为指针经典题目(下)

1.代码(第六题)

char *GetMemory3(int num) {
     char *p = (char *)malloc(sizeof(char) * num);
     return p; 
}   
void Test3(void) {
     char *str = NULL;
     str = GetMemory3(100);
     strcpy(str, "hello");
     cout<< str << endl;
     free(str);   
} 


正确

在“return p”之前:



c6d525810bfaacc0359758825defd2a0.png


在调用GetMemory之后:

aead6e11cdf7c761d09d0300f1aa9b4d.png


2.代码(第七题)

char *GetString(void) {
     char p[] = "hello world";
     return p;   // 编译器将提出警告 
}   
void Test4(void) { 
    char *str = NULL; 
    str = GetString();  // str 的内容是垃圾 
    cout<< str << endl; 
} 


不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡;

在“return p”之前:

49eff4190fd2b3820128ac380e43a0e1.png


在“return p”之后,栈已经被跟随子函数的停止而销毁,所以:


8e841eb30b970e89c04585d36f3f8bcf.png


3.代码(第八题)


char *GetString2(void) {
     char *p = "hello world";
     return p; 
}   
void Test5(void) {
     char *str = NULL;
     str = GetString2();
     cout<< str << endl; 
} 


函 数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。GetString2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。


在“return p”之前:


856661de56a20c186a00022de2248664.png


在“return p”之后:


6fa524cb3b2951eb1eaa4beb7e909017.png



4.代码(第九题)

void test(void) {  
    char *p = (char *) malloc(100);     
    strcpy(p, “hello”);    
     free(p);        // p 所指的内存被释放,但是p所指的地址仍然不变    
    if(p != NULL)   // 没有起到防错作用     
    {        
        strcpy(p, “world”);  // 出错     
    } 
}


在“free(p);”之前:

bc1a5397df4727b10c8a921801e2003c.png


在“free(p);”之后:


31d8e435e9398fff0f5f645407201e52.png


即虽然“hello”所在的堆的100个空间已经被消除了,但是p的值还是0x10006000,是个野指针,不能使用。所以建议在free之后,添加以下代码:

p=NULL;


5.代码(第十题)

#include <stdio.h>
int main(void)
{
    char *p = "helloworld";
    *p = 'T';
    printf("p=%s\n", p);
    return 0;
}


编译通过,但运行时“Segmentation fault (core dumped)”

Segmentation fault (core dumped)一般是对内存操作不当造成的,常见的有:


(1)数组超出范围。

(2)修改了只读内存。


这里因为p指向"helloworld",是字符常量,存放在只读数据段内,不能被修改。若将p指针改为数组,即正确。


完结!


十道经典面试题很经典,值得我们去琢磨深思。


大家加油。。。。。最近在做算法题目可以关注我,点个赞,有问题可以一起讨论。


拜~


2023.02.17

From:努力进大厂的新青年

相关文章
|
14天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
68 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
14天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
42 9
|
14天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
39 7
|
18天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
18天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
55 3
|
19天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
18天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
35 2
|
18天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
32 1
|
存储 C语言
C语言的类型提升
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net  每天都会看CU的博客,尤其是CU首页上面的博客。
924 0
|
14天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
34 10