奇怪的错误:在C中处理字符数组时中止陷阱
我想将每个字符的二进制值存储在一个字符串中并将其存储在一个数组中。 但是当我开始搞乱memset
这样的function时,我无法控制调试。
#include #include int main() { char str[8]; char *ptr = "Hello"; int i; for(; *ptr != 0; ++ptr) { printf("%c => ", *ptr); /* perform bitwise AND for every bit of the character */ for(i = 7; i >= 0; --i) if(*ptr & 1 << i) str[7-i]='1'; else str[7-i]='0'; //(*ptr & 1 << i) ? putchar('1') : putchar('0'); str[8]='\0'; printf("%s\n",str); memset(str,'/0',8); } return 0; }
输出:
H => 01001000 e => 01100101 l => 01101100 l => 01101100 o => 01101111 Abort trap
如果有人可以投光,这将是很好的。 即使我得到输出,陷阱正在发生。
礼貌:这是一个同伴堆栈用户@Athabaska的修改程序。
str[8]='\0'
导致缓冲区溢出,因为str
只有8个元素,而你正试图访问第9个元素。
编辑:我抱怨'/0'
,但正如@R ..通知我,它是有效的 – 但是, memset()
最终会将其参数转换为unsigned char
,所以我认为使用中没有任何意义它,所以我假设作者想要将它改为'\0'
。
str[8]='\0';
是无效的。 如果声明是char str[8];
那么有效指数是0..7
str []只有8个字符的空格,但你可以访问第9个: str[8] = '\0';