C语言内存分配详解13
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
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";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
打印结果是什么?
解答:结果是:0 0 1 1
str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,
它们指向相同的常量区域
———————————————–
3. 以下代码中的两个sizeof用法有问题吗?
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( ‘a'<=str[i] && str[i]<=’z’ )
str[i] -= (‘a’-‘A’ );
}
char str[] = "aBcDe";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函数内的sizeof有问题。
根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大
小。
函数外的str是一个静态定义的数组,因此其大小为6,
函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《C语言内存分配详解13》
本文地址:http://www.xiupu.net/archives-657.html
关注公众号:
微信赞赏
支付宝赞赏