C-字符串的本质是什么?

C-字符串的本质是什么?

瑾兮 发布于 2017-07-26 字数 107 浏览 1231 回复 5

char a=(char)"321";
a的结果是哪个:1 2 3 0 ?
看出来的别点扣分,并说一说你这样回答的理由。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

偏爱自由 2017-10-25 5 楼

我这里运行是 0 ,但是这个 0 是不确定的,a 的值是 "321" 的地址的低8位,因为 "321" 得到的是这个字符串所在的地址,地址本来是 32 位的,在我运行的时候这个字符串的地址是:0x01267830 ,(char)"321" 这种写法表示把这个地址转化为 char 类型,char 类型是 8 位的,所以得到 0x30 ,然后赋值给 char a ,那么 a 就等于 0x30 ,0x30 的 ASCII 码表示刚好表示字符 "0" ,所以如果输出 a 是输出字符 "0"。
所以结论就是,a 的值是 "321" 的地址的低 8 位。

虐人心 2017-10-19 4 楼

前面大伙说的很到位了,俺就稍稍总结一下:

"string" 会开辟一块连续的空间存储字符串,并自动添加 作为结尾用于赋值时,我们会得到这个字符串的首个字符的地址,至少是 32 位char 类型只能保存 8 位char ch = (char)"321"; 实际上就是一个强制类型转换

明确了以上几点,我们稍微改动一下程序:

#include <stdlib.h>
#include <stdio.h>

int main(void){
    printf("%X %Xn", "321", (char)"321");
    return 0;
}

其实在编译的时候编译器已经告诉我们同 char ch = (char)"321"; 同样的提示:
警告:初始化将指针赋给整数,未作类型转换 [默认启用]
警告:将一个指针转换为大小不同的整数 [-Wpointer-to-int-cast]

通过运行的结果,我们会看到:

80484D0 FFFFFFD0

即,ch 经过强制类型转化,截取了低八位的数据没错,但是还在高位全部填充了 1,如果换成 %d 输出,会是负数。

以上结果来自 3.6.4-1-ARCH gcc-4.7.2

换句话说,强制类型转化的时候很多时候会影响符号位,这一点并不是我们希望的,所以要尽量避免这种事情,也要注意编译器的警告提示。

清晨说ぺ晚安 2017-10-06 3 楼

没运行,纯肉眼看,目测是"321"这个字符串地址低8位。并且a还有可能是负数。错了求别点扣分
我思路是这样的,因为char *p = "321"; char a = (char)p;然后就是低8位了。
额。。我知道这个结果应该是不对的 但是一时想不出否定自己的理由,所以贴出来了。。

晚风撩人 2017-09-28 2 楼

#include <stdio.h>

int main()
{
char a=(char)"321";
int i = (int)"321";

printf("a=0x%x; a=%cn", a, a);
printf("i=0x%xn", i);
}

直接看看反汇编代码即可:

 ; COMDAT ??_C@_03NNJHEBOA@321?$AA@
CONST SEGMENT
??_C@_03NNJHEBOA@321?$AA@ DB '321', 00H ; `string'
CONST ENDS

...

; 5 : char a=(char)"321";

mov eax, OFFSET ??_C@_03NNJHEBOA@321?$AA@
mov BYTE PTR _a$[ebp], al

; 6 : int i = (int)"321";

mov DWORD PTR _i$[ebp], OFFSET ??_C@_03NNJHEBOA@321?$AA@

首先i中存的是字符串常量"321"的地址,(char)"321";仅仅是将常量"321"的地址的第8位赋值给了a。
这个运行的结果与你字符串常量中的内容没有任何关系。

虐人心 2017-08-10 1 楼

我运行的结果是-80

字符串在内存中就是一块连续的区域,起始地址是系统分配的,比如“321”,占4字节空间:'3','2','1',''
要想使用内存中的数据,必须知道数据所在的地址,对于字符串,只要知道他的第一个字母所在地址即可,使用时,从此地址开始,依次向后读取,直到遇到结束标志''
字符串在变量存储,函数传参等情况时,传递的只是他的起始地址,也就是指针

C中的数组也是这样的,所以字符串也可看作字符数组。而且对于长度不是确定的量,多用这种方式处理。