【发布时间】:2013-08-31 11:01:07
【问题描述】:
#include <stdio.h>
#define slice(bare_string,start_index) #bare_string+start_index
#define arcane_slice(bare_string,start_index) "ARCANE" #bare_string+start_index
int main(){
printf("slice(FIRSTA,0)==> `%s`\n",slice(FIRSTA,0));
printf("slice(SECOND,2)==> `%s`\n",slice(SECOND,2));
printf("slice(THIRDA,5)==> `%s`\n",slice(THIRDA,5));
printf("slice(FOURTH,6)==> `%s`\n",slice(FOURTH,6));
printf("slice(FIFTHA,7)==> `%s`\n",slice(FIFTHA,7));
printf("arcane_slice(FIRSTA,0)==> `%s`\n",arcane_slice(FIRST,0));
printf("arcane_slice(SECOND,2)==> `%s`\n",arcane_slice(SECOND,2));
printf("arcane_slice(THIRDA,5)==> `%s`\n",arcane_slice(THIRDA,5));
printf("arcane_slice(FOURTH,6)==> `%s`\n",arcane_slice(FOURTH,6));
printf("arcane_slice(FIFTHA,7)==> `%s`\n",arcane_slice(FIFTHA,7));
return 0;
}
输出:
slice(FIRSTA,0)==> `FIRSTA`
slice(SECOND,2)==> `COND`
slice(THIRDA,5)==> `A`
slice(FOURTH,6)==> ``
slice(FIFTHA,7)==> `slice(FIFTHA,7)==> `%s`
`
arcane_slice(FIRSTA,0)==> `ARCANEFIRST`
arcane_slice(SECOND,2)==> `CANESECOND`
arcane_slice(THIRDA,5)==> `ETHIRDA`
arcane_slice(FOURTH,6)==> `FOURTH`
arcane_slice(FIFTHA,7)==> `IFTHA`
我有上面需要帮助的 C 代码。我从
得到了奇怪的行为
类似于函数的宏 slice 应该从传递的索引中“切片”
到字符串的末尾。它不是真正意义上的切片,而是通过
从某个点到 printf 的指针,从该点开始打印
地址。我设法弄清楚arcane_slice 中的字符串
首先连接然后“切片”。我也发现当start_index
等于 6 printf 从空字节开始打印,这就是为什么
你得到'空'字符串。奇怪的是start_index 是 7。它打印printf(interpolator string) 的第一个参数与两者中传递的裸字符串连接。arcane_slice 和 slice(如输出中的第 5 行和第 10 行所示)
为什么是这样吗?
我最疯狂的猜测是,当start_index 超过字符串的长度时,
指针指向程序地址空间中数据段的开始。但是
那么你可以用“为什么不从FIRSTA开始打印”来反驳这一点
【问题讨论】:
-
您的“最疯狂的猜测”是正确的。但是,超出为字符数组正确分配的内存会调用未定义的行为,因此任何事情都可能发生。只是不要这样做。