好吧,我有两个问题,两个问题都是基于我的教授提供的相同示例代码片段:
char arr[3][3] = {
{ '0', '1', '2' },
{ '3', '4', '5' },
{ '6', '7', '\0' }
};
char* base = &arr[0][0], *a = &arr[0][0];
a = base + 5;
printf("base=%d a=%d", base, a);
printf("*a = %c ", *a);
a = base + 3;
printf("row = %s", a); // HERE!
因此,在我标记的行中,我们引用a而不是* a。这是我不明白的。不是a
数字吗 我知道一个字符串知道要对一个字符数组进行火腿处理,直到碰到一个空终止符为止,但是我不明白为什么您不需要星形。不仅仅是一些长屁股吗?用%s格式化它是否知道跟随指针,如果是,为什么%c不这样做呢?为什么在尝试用%s打印时使用星号会导致异常?
不同的格式说明符告诉您printf
如何解释该参数:
%d
将其视为普通整数。向其传递指针(a
)会导致未定义的行为,但可能会打印指针地址的一部分(数量很大)%p
代替%d
。%c
将其视为字符(但仍需使用int
;char
进行隐式转换)。您的代码通过*a
,这的确是一个性格:char
即a
点。%s
将其视为指向char
s的以null终止的字符串的开头的指针。您的代码通过了a
,那就是:指向的指针char
。它将跟随指针,打印字符直到命中\0
。因此,表达式的类型a
是指向的指针char
,而*a
is是char
。如果char
与with一起使用%s
,printf
将尝试将其用作指针。由于此操作“指向”0x00
和之间的存储位置0xFF
,因此会出现段错误,导致无效的内存访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句