您的位置:首页 > 其它

数组与指针内存比较注意

2009-11-28 15:56 260 查看
数组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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: