金鳞

目标->软件测试架构师

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个字节,因此默认的alighment4字节。

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位平台下默认编译方式的情况下,char1字节,为了alignment,编译器会把其后的数据安排在下一个4字节处。导致的直接结果是char看上去占了4个字节

c++_cracker007   16:58:15

对于name1,由于short默认是2字节,和char可以在1个字节下挤下,因此编译器会让charshort放在一个4字节单元,剩下的一个int继续按照对齐方式,放于下一个4字节单元,因此一共要占8字节

c++_cracker007   16:59:04

name2刚才说了,charint分别占了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

第一次怎么是230呢。cb都做了加法运算的

perl_小新 17:33:11

那我重算

perl_小新 17:33:29

第一次 abc2 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 sum16.

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函数会有什么样的结果?

答:内存泄露且非法访问,

指针是值传递,pstr无关。一方面造成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

左上,指针是值传递,pstr无关。一方面造成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
嗯,好了

posted on 2009-03-13 16:58 金鳞 阅读(243) 评论(0)  编辑 收藏 引用 所属分类: c
只有注册用户登录后才能发表评论。