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:努力进大厂的新青年

相关文章
|
5天前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
4天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
5天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
5天前
|
C语言
C语言指针(3)
C语言指针(3)
9 1
|
5天前
|
C语言
C语言指针(2)
C语言指针(2)
9 1
|
8天前
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
|
10天前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
10天前
|
存储 C语言
C语言指针(1)
C语言指针(1)
20 0
|
13天前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
15 0
|
1月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。