0

我想将每个字符的二进制值存储在一个字符串中并将其存储在一个数组中。但是当我开始搞乱像这样的功能时memset,我无法控制调试。

#include <stdio.h>
#include <string.h>
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 的修改程序。

4

3 回答 3

3

str[8]='\0';是无效的。如果声明是,char str[8];那么有效的索引是0..7

于 2011-04-15T17:41:21.273 回答
3

str[8]='\0'导致缓冲区溢出,因为str只有 8 个元素,而您正试图访问第 9 个元素。

编辑:我抱怨'/0',但正如@R.. 告诉我的那样,它有效的 - 但是,memset()最终会将其参数转换为unsigned char,所以我认为使用它没有任何意义,所以我认为作者会想要将其更改为'\0'.

于 2011-04-15T17:42:13.200 回答
2

str[] 只有 8 个字符的空间,但您可以访问第 9 个字符:str[8] = '\0';

于 2011-04-15T17:42:21.487 回答