第一个:
int main(void)
{
char a=256;
int d=a;
printf("d==%d\n",d+1);
}
输出之后为什么是1呢,有人解释说是因为 a 的范围是0-255!
可是有的资料上不是说 char的范围是 -128~127么?
而unsigned char的范围才是0-255.
可是通过gcc编译后,结果也是1。奇怪了!
第二个:
#include <stdio.h>
char *getStr(void)
{
char str[]="abcd";//大家注意这一句
return str;
}
int main(void)
{
char *p=getStr();
printf("p==%s\n",p);
return 0;
}
上面的程序中的那句代码替换成:char *str="abcd";
就没问题了!怎么回事呢?
那char str[]="abcd"与cahr *str="abcd"有什么不一样么?
一
光秃秃的char,既可能相当于unsigned char,有可能相当于signed char,因编译器而异。有的编译器甚至提供了编译选项,由用户选择。
可参考 http://zhidao.baidu.com/question/86383577.html
二
str[]是局部数组,getStr函数返回后,该数组空间释放了。main函数通过p指针去访问这段已释放的地址,出错是自然的。
char *str="abcd";则不同。对于双引号字符串,只要它不是给数组赋值(char str[]="abcd"就是给数组赋值),编译器就会为双引号字符串分配类似于全局变量的长期存在的空间。所以,虽然str这个指针本身是局部暂时存在的,但它指向的abcd字符串却是长期存在的,而且是在main都没开始执行的时候就开始存在了(跟全局变量一样。而不是在进入getStr时才分配空间)。
注意:char str[]="abcd"不会分配全局空间。这句只相当于
char str[]={'a','b','c','d','\0'};
光秃秃的char,既可能相当于unsigned char,有可能相当于signed char,因编译器而异。有的编译器甚至提供了编译选项,由用户选择。
可参考 http://zhidao.baidu.com/question/86383577.html
二
str[]是局部数组,getStr函数返回后,该数组空间释放了。main函数通过p指针去访问这段已释放的地址,出错是自然的。
char *str="abcd";则不同。对于双引号字符串,只要它不是给数组赋值(char str[]="abcd"就是给数组赋值),编译器就会为双引号字符串分配类似于全局变量的长期存在的空间。所以,虽然str这个指针本身是局部暂时存在的,但它指向的abcd字符串却是长期存在的,而且是在main都没开始执行的时候就开始存在了(跟全局变量一样。而不是在进入getStr时才分配空间)。
注意:char str[]="abcd"不会分配全局空间。这句只相当于
char str[]={'a','b','c','d','\0'};
温馨提示:答案为网友推荐,仅供参考
第1个回答 2009-03-06
第一个:char a = 256表示去ASCII码为256的符号,很明显,没有256超界,从0开始。你所说的-128~127是有符号情况下的,当char为unsigned的时候就是0~255
第二个:str是在函数中定义的变量,当函数执行完毕时,str是会被自动释放的,而str赋的值又是一个静态变量,他的内存空间是一定的,str被释放以后,这个abcd所存放的位置就自动消失了。那么那句return就没有返回所想要的东西,用指针返回指向静态存储区的首地址,可以通过指针来标记字符串存储的位置。就算str字符串经过函数执行完毕被释放,那个指向静态存储区字符串的指针是不会改变的,所以可以用指针返回本回答被提问者采纳
第二个:str是在函数中定义的变量,当函数执行完毕时,str是会被自动释放的,而str赋的值又是一个静态变量,他的内存空间是一定的,str被释放以后,这个abcd所存放的位置就自动消失了。那么那句return就没有返回所想要的东西,用指针返回指向静态存储区的首地址,可以通过指针来标记字符串存储的位置。就算str字符串经过函数执行完毕被释放,那个指向静态存储区字符串的指针是不会改变的,所以可以用指针返回本回答被提问者采纳
第2个回答 2009-03-06
1、首先,256是int类型,二进制是0x01FF,强制转换成char后(cpu大小端是little endian的情况),发生截断,是0x01,所以打印出来就是1了。
此外,char到底可不可以为负,看具体的编译参数。
2、区别是:
前者是普通的初始化字符串,确切来说是普通字符,编译后这些字符串不再出现在二进制代码中。后者是常量字符串,编译后存放在静态存储区,确切的写法是const char *str="abcd",因为这是只读的字符串。
此外,char到底可不可以为负,看具体的编译参数。
2、区别是:
前者是普通的初始化字符串,确切来说是普通字符,编译后这些字符串不再出现在二进制代码中。后者是常量字符串,编译后存放在静态存储区,确切的写法是const char *str="abcd",因为这是只读的字符串。