2009.3.12
shizh:能用钱解决的问题都不是问题,问题是没有钱。 说:
const char* ptr; char *const ptr;这两种方式是不一样的,一个修饰类型一个修饰指针,修饰指针的这个指针的地址不可以改变,修饰类型的这个指针所指向的内容不能变。
海阔天空 说:
const char* ptr:是修饰类型的,可以看做 (const char*)ptr,既然char* 是const,那么能变的只能是ptr,也就是地址能变内容不能变。 char *const ptr:是修饰指针的,可以看做char (*const ptr),既然*ptr是const,那么就是内容不能变地址能变。
我是这么理解的 - - 对不?
shizh:能用钱解决的问题都不是问题,问题是没有钱。 说:
char *const ptr 是修饰指针的,可以看做char (*const ptr),既然*ptr是const,那么就是内容不能变地址能变。--------这个地方不对,应该是内容能变地址不能变。
海阔天空 说:
有个地方错了,应该是 char *const ptr 是修饰指针的,可以看做char (*const ptr),既然ptr是const,那么就是内容能变地址不能变。
举个例子
shell_老汤(13129252) 17:34:01
to 小新
char g_szTest[]="iiiii";
char g_szTest2[]="2222";
int main(int argc, char* argv[])
{
const char* ptr=g_szTest;
printf("%s\n", ptr);//iiii
char *const ptr2 = g_szTest2;
printf("%s\n", ptr2);//2222
ptr="aaaa";
printf("%s\n", ptr);//aaaa
//*ptr="bbb";//error
//ptr2="bbb";//error
// ptr2=ptr;//error
*ptr2=*ptr;
printf("%s\n", ptr2);//a222
return 0;
}
const char *ptr --- 常用做函数参数。当你不希望该函数改变参数内容时。
exp
void fun(const char *pszInput, char *pszOut);
老堂大好人 ;)
********************************************************************************************************
2009.3.13
perl_小新 15:21:58
c_config *conf = g_share_map->conf;
c++_cracker007 15:23:11
取g_share_map所指结构的一个成员(conf),该成员是指向_c_config的指针,把这个指针赋给conf 。
perl_小新 17:43:09
007 - -
perl_小新 17:43:16
c++_cracker007 15:23:11
取g_share_map所指结构的一个成员(conf),该成员是指向_c_config的指针,把这个指针赋给conf 。
perl_小新 17:44:05
你这句话里 ,指针 表示 指针变量 还是 地址?
c++_cracker007 17:44:52
不知道你的意思。
int a; int* p; p=&a;
我所说的"指针"就是p
perl_小新 17:45:07
那就是地址
perl_小新 17:45:20
呃 我想想
LOVE CODE 17:46:11
唉,我已经忘了指针是什么东东了
perl_小新 17:46:40
小蓝 也总 唉唉唉的 。
perl_小新 17:46:50
年纪轻轻的 ,至于吗
旋木 17:47:05
bu zhiyu,heihei
perl_小新 17:47:11
;)
perl_小新 17:48:12
- - 007
perl_小新 17:48:33
c++_cracker007 15:23:11
取g_share_map所指结构的一个成员(conf),该成员是指向_c_config的指针,把这个指针赋给conf 。//最后那句话,应该是把地址给了conf吧?
c++_cracker007 17:49:15
int a;
int* p;
p=&a;
这个p叫做指针变量。
perl_小新 17:49:42
指针变量的内容是地址
c++_cracker007 17:50:30
int b;
int a=b;
把变量b赋给a
int* p1=&b;
int* p2;
p2=p1;
把变量p1赋给p2.
就是这个意思。
perl_小新 17:51:06
那就是地址 - -
c++_cracker007 17:51:12
这里一般都是说指针或指针变量。说地址一般被理解为&p
c++_cracker007 17:52:06
a=*p //指针指向的值赋给a
a=p //指针赋给a
a=&p //指针的地址赋给a
一般的说法。
perl_小新 17:52:13
地址我理解为指针变量肚子里的东西
c++_cracker007 17:52:37
没错的,你理解了就行。因为一般说都是直接说指针。因为地址有很多地址
perl_小新 17:52:43
恩
**************************************************************************************************
2009.3.16
perl_小新 16:41:51
007
perl_小新 16:41:59
struct name1{
char str;
short x;
int num;
}
struct name2{
char str;
int num;
short x;
}
sizeof(struct name1)=____________,
sizeof(struct name2)= ____________,
perl_小新 16:42:43
char 2 short 2 int 2 ,第一个是6
c++_cracker007 16:43:00
char 2
int 2
这两个都错了
c++_cracker007 16:43:25
32位平台上,char 1 short 2 int 4
perl_小新 16:43:56
007 是什么顺序了?
perl_小新 16:44:10
以大的为准,对吗
c++_cracker007 16:44:17
咱们先不讨论顺序。
perl_小新 16:44:25
- - 讨论啥?
c++_cracker007 16:44:29
顺序那个是深一点的话题了。
c++_cracker007 16:44:38
你要先搞清楚基本的类型大小
perl_小新 16:45:01
“32位平台上,char 1 short 2 int 4”我暂且记下了
perl_小新 16:45:18
然后呢
c++_cracker007 16:45:35
ok.现在把顺序加进来。实际上你说的“顺序”是由于alignment造成的
c++_cracker007 16:45:47
如果你想要和顺序没关系的话,用pragma屏蔽一下alignment.或者可以调整默认的alignment.
我被perl染了色 16:46:22
7仔,你别说的这么深奥了,小新不懂
perl_小新 16:46:38
和顺序有关系的呢?
c++_cracker007 16:46:49
比如#pragma pack(1)
这样就是和顺序无关,严格按照类型大小计算。当然是以降低性能为代价
c++_cracker007 16:47:11
32位平台上,指针一次跨越4个字节,因此默认的alighment是4字节。
c++_cracker007 16:47:28
所以,把这个考虑进去之后,才和顺序有关系
我被perl染了色 16:47:37
c++_cracker007 16:48:36
这个明白不?明白我就继续讨论你那道题的结果
perl_小新 16:48:41
不
c++_cracker007 16:49:25
貌似很难解释的样子,如果你不太了解32位平台的一些硬件特性。
perl_小新 16:49:42
那就继续讲我那道题
perl_小新 16:49:50
我可以记下来 以后慢慢懂
c++_cracker007 16:50:04
不行的,必须先讲清楚这个概念,否则你不知其所以然。
perl_小新 16:50:28
这是一个结构体,关指针什么事情呢
c++_cracker007 16:51:05
因为这个结果关系到alignment.而alignment在不同平台是不同的。这么说吧,你这道题的结果在不同平台、不同编译指令的作用下可以千变万化。
perl_小新 16:51:40
要win32的 - -
c++_cracker007 16:51:50
16位平台下,默认编译指令,name1=6,name2=6
c++_cracker007 16:52:02
32位平台下,默认编译指令,name1=8,name2=12
perl_小新 16:52:22
咋算的?
c++_cracker007 16:52:48
所以我要告诉你alignment的概念啊。明白这个你才知道什么原因
perl_小新 16:52:58
汉语啥意思?
c++_cracker007 16:53:12
内存对齐
perl_小新 16:53:42
你先讲 我拦住开发
我被perl染了色 16:54:07
不对齐会不会溢出啊
c++_cracker007 16:54:30
不会的,和这个没关系
c++_cracker007 16:55:24
32位平台上,cpu寻址是按照4字节的。原因是,顾名思义,32位就是数据总线和地址总线都是32位的,因此cpu一次传送32位==4字节数据。所以,如果你的数据不在可以被4整除的内存边界上,cpu需要重新寻址,这样性能就降低了。
为此,编译器默认在编译时都会把数据按照cpu指针长度,对齐于内存边界。当然,你可以使用编译指令更改这一默认行为
我被perl染了色 16:56:21
嗯
c++_cracker007 16:56:45
对于name2,在32位平台下默认编译方式的情况下,char是1字节,为了alignment,编译器会把其后的数据安排在下一个4字节处。导致的直接结果是char看上去占了4个字节
c++_cracker007 16:58:15
对于name1,由于short默认是2字节,和char可以在1个字节下挤下,因此编译器会让char和short放在一个4字节单元,剩下的一个int继续按照对齐方式,放于下一个4字节单元,因此一共要占8字节
c++_cracker007 16:59:04
name2刚才说了,char和int分别占了4字节,剩下的short刚好从4字节边界开始,但是为了其后数据的对齐,short也被"扩充为"4字节,因此一共是12字节
我被perl染了色 16:59:55
不足补0
perl_shadow 17:00:29
U16 array[255];
char*temp="严";
if((mbstowcs(array,temp, strlen(temp)))==-1)
{ printf("error\n"); }
你这样试试?我这边一直返回-1
c++_cracker007 17:01:46
U16?这个不是标准类型吧
perl_shadow 17:02:18
typedef unsigned short U16;
c++_cracker007 17:02:59
我这里可以转换
perl_shadow 17:03:17
那就是系统问题
c++_cracker007 17:03:18
不是,你转换中文要先setlocale
c++_cracker007 17:03:38
setlocale(LC_ALL,"zh_CN.GB2312");
perl_shadow 17:04:06
我看下,问题是我这边的默认字符集不知道有哪些
perl_shadow 17:04:16
我是从中文转为U16
c++_cracker007 17:04:29
我这里也是的
perl_shadow 17:05:14
setlocale(LC_ALL,"zh_CN.GB2312");
这个设置的是被转字符集?
perl_shadow 17:05:24
看来我理解反了
c++_cracker007 17:05:30
是啊
perl_shadow 17:10:47
还是不行
perl_shadow 17:12:42
代码基本一样
perl_shadow 17:12:50
只可能是系统差别
c++_cracker007 17:13:50
我的系统上全都是en_US,这个是最基本的了
c++_cracker007 17:13:55
没有其它字符集了
perl_shadow 17:17:44
locale -a只有一种吗?
perl_shadow 17:18:03
我这上面看不到LOCALE,根本不清楚有哪些字符集
perl_小新 17:18:56
搞定开发了,我来理解下
c++_cracker007 17:19:00
我的locale -a全都是en_US.我装系统的时候自己手动调的
c++_cracker007 17:20:03
正常的话有很多的,zh_CN,乱七八糟的一些国家
perl_小新 17:21:05
也想起来那个问题了
perl_小新 17:21:17
写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个
perl_小新 17:21:26
介个也不会
perl_小新 17:21:43
要用#define,是吗
perl_小新 17:21:54
还是typedef?
c++_cracker007 17:22:00
#define MIN(a,b) (a<b?a:b)
perl_小新 17:23:37
12、请问以下代码有什么问题:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
int main()
{
char str1[5]={‘a’,’b’,’c’,’d’,’e’};
char str2[6];
strcpy(str2,str1);
printf(str2);
return 0;
}
c++_cracker007 17:24:43
strcpy(str,"hello"); //这个空间不够。
strcpy(str2,str1); //这个缺少\0
perl_小新 17:29:42
13、写出程序运行结果
int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int I;
int a=2;
for(I=0;I<5;I++)
{
printf("%d,", sum(a));
}
}
perl_小新 17:29:59
要过程也要结果 - -
c++_cracker007 17:30:57
你自己推导一下,写一写就出来了。
perl_小新 17:30:59
a b c 都是不一样的变量,每次一个循环结束后,有些值是保留的,有些是不保留的
perl_小新 17:31:53
第一次,a b c 是 2 3 0 ,sum =5;
perl_小新 17:32:25
- - 不会
c++_cracker007 17:32:57
第一次怎么是2,3,0呢。c和b都做了加法运算的
perl_小新 17:33:11
那我重算
perl_小新 17:33:29
第一次 abc是2 5 1 sum=8;
c++_cracker007 17:33:57
对呀。继续下去你就算出来了
perl_小新 17:34:58
第二次 abc 是 2 7 1 sum=10
perl_小新 17:35:00
- - 这个对吗
c++_cracker007 17:35:15
对呀
perl_小新 17:35:32
怎么会这样
perl_小新 17:36:42
第三次 abc 是2 9 1 sum =12;第四次 abc是 2 11 1 sum14;第五次 abc是 2 13 1 sum是16.
perl_小新 17:36:47
这道题是我自己做的
perl_小新 17:37:56
14、有关内存的思考题
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:内存泄露且非法访问,
指针是值传递,p和str无关。一方面造成p的内存泄露,一方面造成str没有拿到内存,即非法访问。
|
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:非法访问,
返回的p指向栈内存,GetMemory返回后这部分内存被回收,造成非法访问。
|
Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:ok,
二级指针p用来模拟str的引用传递,因此没问题
|
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:非法访问,str被free后变成了野指针。
Linux_菊花晶(59958678) 9:41:46 str 指向那块内存,就相当于你说那是你家房子. free掉就是卖了.
你房子都卖了,还非要说那是你家的,能不出问题么? Linux_菊花晶(59958678) 9:45:29 问题是原来的malloc出来的那段内存有结束符,你free掉以后就没有结束符了. Linux_菊花晶(59958678) 9:46:11 你给出str指针,往下找结束符的时候,就会出错 Linux_菊花晶(59958678) 9:47:36 是这个理吧
php-木头人(445498529) 9:37:37 小新那代码是危险代码啊 perl_小新(147551562) 9:37:44 - - perl_小新(147551562) 9:37:57 我在编译器里走的,啥危险啊? Linux_菊花晶(59958678) 9:38:09 能编译的过? perl_小新(147551562) 9:38:19 你再说危险 ,我就换机器了,吓人的。 perl_小新(147551562) 9:38:28 能啊 ,黑屏都出来了 php-木头人(445498529) 9:38:28 free了后就不应该有任何其它的操作了 Linux_菊花晶(59958678) 9:38:50 有啊.应该加上 str =null perl_小新(147551562) 9:38:55 free应该没成功,啥都没打印出来。 php-木头人(445498529) 9:39:07 free成功了的, perl_小新(147551562) 9:39:29 free不成功打印hello,不成功打印world perl_小新(147551562) 9:39:41 可是虾米也木有。 Linux_菊花晶(59958678) 9:39:42 就是str指针野了,以后的操作后果都是未知的 php-木头人(445498529) 9:39:57 嗯. php-木头人(445498529) 9:40:19 虾米也木有就是那指针烂掉了.
|
perl_小新 17:45:43
我只知道malloc是分配内存的
perl_小新 17:46:32
内存导致的问题也就是内存溢出
perl_小新 17:47:01
我的软件测评师教程 到了
c++_cracker007 17:47:11
左上内存泄露且非法访问
右上非法访问
左下没问题
右下非法访问
perl_小新 17:47:13
晚上 有书看了
perl_小新 17:47:32
如果我问 为什么,你介意吗?
c++_cracker007 17:48:04
我觉得你应该先放下windows程序设计,先补补c基础
perl_小新 17:48:17
很对 ,我周末贪玩了
c++_cracker007 17:48:58
解释可以,但是你真的要去好好看看c的基础书,否则基础不牢会吃大亏的。
perl_小新 17:49:22
嗯 我会的,一个月以后考试 也会用到,我一定要看。
c++_cracker007 17:52:09
左上,指针是值传递,p和str无关。一方面造成p的内存泄露,一方面造成str没有拿到内存,即非法访问。
右上,返回的p指向栈内存,GetMemory返回后这部分内存被回收,造成非法访问
左下,二级指针p用来模拟str的引用传递,因此没问题
右下,free并不能把str清为0(NULL)
perl_小新 17:52:28
perl_shadow 17:57:46
malloc完要判断内存是否为空吧
c++_cracker007
经常判断是个好习惯。
***********************************************
20090323
c_D 14:15:12
const char_t& cSearch = *lpszSearch;//啥意思
c++_cracker007 14:16:29
定义一个宽字符常量的引用cSearch,初始化为后面那个字符串的首字符
**********************************************************************
c_D 16:30:29
::GetModuleFileName(NULL,pathw,256);//有这样写的吗?前边那两个冒号
冒号的前边空着可以吗?
php-木头人 16:30:50
可以
c_D 16:30:59
那默认是啥呢?
php-木头人 16:31:15
带::和不带是一样的。
Linux_风花雪月 16:31:19
呵呵
c_D 16:31:24
那为啥要加上呢?
Linux_风花雪月 16:31:24
默认是自己
c++_cracker007 16:31:26
不一样的
php-木头人 16:31:31
::代表域的符号
php-木头人 16:31:40
如果
:: 前面是空的话,就是全域
php-木头人 16:32:04
默认是全域的, 除非在类里面有相同的成员函数
c++_cracker007 16:32:12
::F() 这个是调用全局名字空间的符号
F() 这个是使用当前名字空间的符号
c++_cracker007 16:32:59
GetModule这个是sdk的函数,是全局名字空间的,所以要::
**************************************************************
Linux_稀滥16:20:34
用的SecureCRT,是默认的字符集
Mysql_To Study16:20:46
default ?
内核_YangNas16:21:02
改成UTF-8的,然后保存,然后重新登陆
Linux_稀滥16:21:17
嗯,default
Mysql_To Study 16:21:38
export LANG=US_UTF-8 然后把client 调成utf8
Mysql_To Study16:22:05
否则修改/etc/sysconfig/i18n
Linux_稀滥16:22:22
嗯,好了