在检查一些现有代码时,我碰到了这一行:
char *s = malloc(SIZE);
scanf("%s", s);
char *y = s + strlen(s);
假设scanf()
函数成功,将整数添加到char数组是什么意思?
我的期望是得到一个包含s
内容的新字符串和另一个具有整数(或至少是原始字符串)的ASCII码的字符。
通过调试此代码,似乎在操作之后y=""
。
对此行为的解释是什么?
答案 0 :(得分:5)
以数组索引操作而不是指针算术的形式编写代码可能更清楚。
int n;
char* y = s + n;
char* y = &s[n];
这两种形式是等效的。 s
是数组中第一个元素的地址。向其添加一个将为您提供数组中下一个元素的地址,依此类推。假定数组足够大,则两个表达式都求值到数组中第n个元素的地址。在这种情况下,y指向字符串末尾的空终止符。
答案 1 :(得分:2)
strlen(s)
查找字符串的长度,该长度也恰好是终止\0
字符的索引。
向指针添加整数会找到一个指针,该指针就是内存中还有很多元素。因此,表达式s + strlen(s)
将s
的长度添加到指针值。这意味着它将计算一个指向\0
字符的指针。
一种等效的方法,可能更为简洁
char *y = strchr(s, '\0');