C语言内存分配详解13


void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

strcpy(str,hello);

printf(str);

}

同NO.1

NO.4

void Test(void)

{

char *str = (char *)malloc(100);

strcpy(str,hello);

free(str);

if(str != NULL)

{

strcpy(str,world);

printf(str);

}

}

同NO.1

我对以上的分析:

NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地

址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char 类型的指针

p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100

个空间,4返回Test函数.最后程序把字符串hello world拷贝到str指向的内存空间里.到

这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,

将不难发现所在!(建议:画图理解)

NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下

动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付

给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当

然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数

调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有

的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东

西.

NO.3:正确答案为可以打印出hello.但内存泄漏了!

NO.4:申请空间,拷贝字符串,释放空间.前三步操作都没有任何.到if语句里的判断条

件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.所以if语

句永远都不能被执行.这也是著名的"野"指针问题.所以我们在编写程序释放一个指针之后一

定要人为的将指针付成NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,

会带来意想不到的错误

4.3 指针使用面试题

1. char * const p;

  char const * p

  const char *p

  上述三个有什么区别?

  char * const p; //常量指针,p的值不可以修改

  char const * p;//指向常量的指针,指向的常量值不可以改

  const char *p; //和char const *p

——————————————————

2. char str1[] = "abc";

  char str2[] = "abc";

  const char str3[] = "abc";

  const char str4[] = "abc";

  const char *str5 = "abc";

  const char *str6 = "abc";

  char *str7 = "abc";

  char *str8 = "abc";

打印结果是什么?

解答:结果是:0 0 1 1

str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,

它们指向相同的常量区域

———————————————–

3. 以下代码中的两个sizeof用法有问题吗?

  void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母

  {

str[i] -= (‘a'-‘A' );

  }

  char str[] = "aBcDe";

  UpperCase( str );

答:函数内的sizeof有问题。

根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大

小。

函数外的str是一个静态定义的数组,因此其大小为6,

函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《C语言内存分配详解13
本文地址:https://www.zhiletu.com/archives-657.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微