看完后.明白**讲的为什么char** 不能自动转化为 const char**,(原文)但对我影响最深的是下面的话:
==================================================================
char *p="abc" 能不能编译通过要看你使用的编译器。鉴于大量遗留代码的存在,大部分编译器允许其通过,或者给个警告。当然,程序员自己必须保证绝不去修改其值。
程序员不应该在代码中出现*p='A'这样的语句。这是当初约定好了的:编译器允许char *p="abc"通过,而程序员保证不去修改它。
b. *p='A'编译时应该允许通过,因为单就这条语句而言,它完全合法。
c. 运行时*p='A'能不能通过要看实际的运行环境,包括你使用的操作系统、编译器、编译器选项 等等,一句话,其运行结果由不得你,且不应该由你去关心,因为这种行为本身已经违反约定了。
==================================================================
工作关系吧,用CString 和string用的太多了,很少这样定义字符串 char *p=“abcde“了
匝一看,还不适应,:(,渐渐的回想才想起一些来(哎,还是太生疏,赶快写下来,以后别忘了)
这样定义的字符串char *p=“abcde“ ; char *p1=“123445667“;
正如上面提到的是不能再 *p='A',运行的时候会出错,同样,strcpy(p,p1)也会出错哟,
"abcde"字符串可以看做是个常量字符串了,是不能被修改的,
但如果 char p[]=“abcde“ 这样定义,就没有问题,你可以修改*p='A',只要不越界就ok.
并且发现这样两种定义
char *p=“abcde“
char p[]=“abcde“
在运行的时候,p指向的地址也不是一样的,可见char *p=“abcde“还是有特殊的处理 :),具体怎么处理就不知道了,高手请指教:)
随着测试,又发现个问题,可能是个老问题了吧:
int main(int argc, char* argv[])
{
int t[10];
char p1[7]="123456";
const char *p2="1234567890123213123";
int len(0);
//*p1='C'; err
len=strlen(p1);
printf("%d\n",len);
strcpy(p1,p2); ///??????????
printf("%s\n",p1);
len=strlen(p1);
printf("%d\n",len);
return 0;
}
我定义的是7个字符数组, 但用strcpy把p2拷到p1中,p1是放不下的,但程序却正常执行,warning ,err都没有,运行也正常?
输出
6
1234567890123213123
19
应该是使用内存越界了阿??怎么会正常运行呢?
难道对于内存越界的使用,运气好才崩溃表现出来,运气不好就正常运行??
posted on 2005-12-29 19:37 teky 阅读(2203)
评论(15) 编辑 收藏