posts - 19,  comments - 21,  trackbacks - 0
有些东西在你没有遇到之前还真是不知道自己没有弄清楚,也许是我平时细节的地方注意少了,看来以后要多加注意了。

char *pStr;
char ch;
char str[] = "Hello";

ch 
= str[1];
*pStr = str[1];

printf(
"ch = %c\n", ch);
printf(
"*pStr = %c"*pStr);

此时打印ch值的时候能正确输出,但是打印pStr[0]的时候就出问题了,跟踪发现是pStr[0] = str[1];这句出现问题。

原来,char *pStr; 只定义了一个4字节的指针变量,而这个变量里面的内容是将要指向一个char类型变量的,但是此时pStr只是个“野指针”,并没有指向一个char类型的内存单元,所以,当用*pStr来访问这个元素时,系统根本不知道该访问何处的空间,因此,在使用pStr前,必须让它指向一个具体的空间。

由上面可以将相关语句改为
char *pStr;
char ch;
char str[] = "Hello";

pStr 
= &ch;    //pStr指向ch、获得初始化
pStr = &str[1];  //pStr指向str[1]地址、获得初始化
ch = str[1];
*pStr = str[1];

printf(
"ch = %c\n", ch);
printf(
"*pStr = %c"*pStr);
也就是说,要先给指针一个地址值初始化它,然后才能用*访问它指向的内容。



◎另外,在子函数中使用malloc()/new()分配的内存空间不会因子函数的返回而消失,函数只会清理调子函数里定义的变量的空间,如:
char* func()
{
  
char *p;
  p 
= (char *)malloc(sizeof(char));
  
  
return p;
}
  //返回后,p所在空间被释放,但是p所指空间还存在
所以,可以用p1=func();来获得在func()中分配的空间。

此中方法可以用来解决“指针的指针”使用不方便的问题。步骤分2步:1、把传入的指针的指针参数去掉;2、把函数的返回值赋给要改变的对象的指针:
void GetMemory2(char **p, int num)
{
  
*= (char *)malloc(sizeof(char* num);
}

void Test2(void)
{
  
char *str = NULL;
  GetMemory2(
&str, 100);   // 注意参数是 &str,而不是str
  strcpy(str, "hello");    
  cout
<< str << endl;
  free(str);    
}


//////下面是用传递动态内存的方法实现
char *GetMemory3(int num)
{
  
char *= (char *)malloc(sizeof(char* num);
  
return p;
}

void Test3(void)
{
  
char *str = NULL;
  str 
= GetMemory3(100);    
  strcpy(str, 
"hello");
  cout
<< str << endl;
  free(str);    
}

因为此时用malloc/new分配的内存空间是堆里面的,函数返回时不会回收;而如果在子函数中用char p[]="asdfgewq";则p是在栈中定义的(先分配p的空间,然后讲字符串拷贝进去,跟char *p="asdfasdf"分配在全局静态内存中不一样),所以会被系统收回。
posted on 2005-12-21 10:55 halCode 阅读(551) 评论(0)  编辑 收藏 引用 所属分类: 算法/数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

相册

编程资源

不务正业

找工作

搜索

  •  

最新评论

阅读排行榜

评论排行榜