使用预处理器宏时出现分段错误

时间:2015-10-02 11:08:44

标签: c++ macros

我在Linux下用C ++中的另一个程序员完成了一个项目,我试图弄清楚为什么在使用带有16个ASCII字符数组的预处理器宏时会出现Segmentation Fault,但是当使用少于或多于16个字符时则没有。

宏定义:

#define func(a,b) { char *p=a; char *r=b; while(*p) *p++ -= *r++; } while(0)

并在代码中使用它:

char str1[16] = { 0xBD, 0x71, 0x27, 0xF4, 0xB1, 0x24, 0xF7, 0xA0, 0xC4, 0x78, 0x84, 0xBE, 0x79, 0xC1, 0x85, 0x39 };
char str2[19] = { 0x70, 0x06, 0xBE, 0x92, 0x7E, 0xB6, 0x8F, 0x52, 0x5D, 0x42, 0x40, 0x8A, 0x01, 0x48, 0x19, 0xCF, 0xE7, 0xF1, 0x80 };
func1(str1,str2);

基本上,宏将str1中的每个字符与str2中相同位置的字符值进行移位。由于它使用无符号字符这一事实,即使通过移位,它获得负值,它返回返回正确字符的模数。

所以问题不在于移位,移位后获得的值与字符串的大小有关。

如果我使用大小为1到15或17到90个ASCII字符的str1它没有任何问题,但是当str1等于16个ASCII字符时,我得到分段错误。

我已经将宏转换为函数,即使使用16个ASCII字符也可以正常工作。

为什么会出现这种行为?

谢谢

1 个答案:

答案 0 :(得分:3)

尽管第一个字符串的大小,你需要有' 0x00'在字符串的末尾。