数组与指针内存比较注意

来源:互联网 发布:手机淘宝改好评 编辑:程序博客网 时间:2024/04/28 11:05

 数组char *a[]=“hello”;

 指针char *p=“hi”;

 

a是整个char的首地址,是个常量!对a的赋值是错的!只可以对其内容进行改变!

且sizeof(a)=6;

a大小固定为6,不可再改变了!

注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
不论数组 a 的容量是多少,sizeof(a)始终等于 sizeof(char *)。

其实质是void Func(char a[100])
 {
    cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}

 

 

p是个地址的变量,它可以改变!sizeof(p)=2;

char *q="what";

p=q;

则p地址(=q地址)指向了q地址内容!

不可单独对p[2]......赋值!

..........................完善中............................

 

指针的赋值注意:不能调用函数参数进行指针的赋值,调用参数都是局部变量,退出便释放了!

void GetMemory(char *p, int num)
{
  p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
  char *str = NULL;
  GetMemory(str, 100);  // str 仍然为 NULL 
 strcpy(str, "hello"); // 运行错误
}

 

如上str依旧==NULL

 

若真要用就用函数返回值进行,如下: 但注意,char *GetMemory3(int num)
{
  char *p = (char *)malloc(sizeof(char) * num); //

//林锐 博士  在其编的 高质量编程指南中说:  char p[]="hello";栈内存不行!返回指针但没有内容!!!!

////不要用栈内存的返回地址,如上例道理一样,因为该内存在函数结束时自动消亡

////

//((((((但我试过是可以的,也就是Tset3中str=“hello”中这里请看过的读者自己试试,愿意交流!)))))))))

//

//又试了下,,,str指向的内存中是已经没有值了!!!用cout ,printf,memcpy能发现没有值了

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

原创粉丝点击