char name[1],但当我输入13个字符时,屏幕上会发生很多事情

char name[1],但当我输入13个字符时,屏幕上会发生很多事情,c,arrays,char,C,Arrays,Char,它来自于“C初级读物+4.2.2字符串”一书 我正在使用macxcode亲自尝试示例代码 代码如下: #include <stdio.h> #define PRAISE "You are an extraordinary being." int main(void) { char name[1]; printf("What\'s your name?\n"); scanf("%s", name); printf("Hello, %s. %s\n",

它来自于“C初级读物+4.2.2字符串”一书 我正在使用macxcode亲自尝试示例代码

代码如下:

#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
    char name[1];

    printf("What\'s your name?\n");
    scanf("%s", name);
    printf("Hello, %s. %s\n", name, PRAISE);

    return 0;
}
#包括
#定义赞美“你是一个非凡的存在。”
内部主(空)
{
字符名[1];
printf(“你叫什么名字?\n”);
scanf(“%s”,名称);
printf(“你好,%s.%s\n”,姓名,赞美);
返回0;
}
当我输入“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

libdyld.dylib`dyld3::MachOFile::forEachLoadCommand:
0x7fff697aa8a8 <+0>:   pushq  %rbp
0x7fff697aa8a9 <+1>:   movq   %rsp, %rbp
0x7fff697aa8ac <+4>:   pushq  %r15
0x7fff697aa8ae <+6>:   pushq  %r14
0x7fff697aa8b0 <+8>:   pushq  %r13
0x7fff697aa8b2 <+10>:  pushq  %r12
0x7fff697aa8b4 <+12>:  pushq  %rbx
0x7fff697aa8b5 <+13>:  subq   $0x28, %rsp
0x7fff697aa8b9 <+17>:  movb   $0x0, -0x29(%rbp)
0x7fff697aa8bd <+21>:  movq   %rdx, %r12
0x7fff697aa8c0 <+24>:  movq   %rsi, %rbx
0x7fff697aa8c3 <+27>:  movq   %rdi, %r15
->  0x7fff697aa8c6 <+30>:  movl   (%r15), %edx
0x7fff697aa8c9 <+33>:  cmpl   $0xfeedface, %edx         ; 
imm = 0xFEEDFACE 
0x7fff697aa8cf <+39>:  je     0x7fff697aa8e3            ; 
<+59>
0x7fff697aa8d1 <+41>:  cmpl   $0xfeedfacf, %edx         ; 
imm = 0xFEEDFACF 
Diagnostics::error(char const*, ...)
0x7fff697aa9a2 <+250>: addq   $0x10, %rsp
0x7fff697aa9a6 <+254>: addq   $0x28, %rsp
0x7fff697aa9aa <+258>: popq   %rbx
0x7fff697aa9ab <+259>: popq   %r12
0x7fff697aa9ad <+261>: popq   %r13
0x7fff697aa9af <+263>: popq   %r14
0x7fff697aa9b1 <+265>: popq   %r15
0x7fff697aa9b3 <+267>: popq   %rbp
0x7fff697aa9b4 <+268>: retq   
libdyld.dylib`dyld3::MachOFile::forEachLoadCommand:
0x7fff697aa8a8:pushq%rbp
0x7fff697aa8a9:movq%rsp%rbp
0x7fff697aa8ac:pushq%r15
0x7fff697aa8ae:pushq%r14
0x7fff697aa8b0:pushq%r13
0x7fff697aa8b2:pushq%r12
0x7fff697aa8b4:pushq%rbx
0x7fff697aa8b5:subq$0x28,%rsp
0x7fff697aa8b9:movb$0x0,-0x29(%rbp)
0x7fff697aa8bd:movq%rdx,%r12
0x7fff697aa8c0:movq%rsi,%rbx
0x7fff697aa8c3:movq%rdi,%r15
->0x7fff697aa8c6:movl(%r15),%edx
0x7fff697aa8c9:cmpl$0xfeedface,%edx;
imm=0xFEEDFACE
0x7fff697aa8cf:je 0x7fff697aa8e3;
0x7fff697aa8d1:cmpl$0xfeedfacf,%edx;
imm=0xFEEDFACF
诊断::错误(字符常量*,…)
0x7fff697aa9a2:addq$0x10,%rsp
0x7fff697aa9a6:addq$0x28,%rsp
0x7fff697aa9aa:popq%rbx
0x7fff697aa9ab:popq%r12
0x7fff697aa9ad:popq%r13
0x7fff697aa9af:popq%r14
0x7fff697aa9b1:popq%r15
0x7fff697aa9b3:popq%rbp
0x7fff697aa9b4:retq
为了简单起见,我省略了上面的一些代码

如果我输入更多字母,说20“a”, 它返回:错误:0x7fff00616000的内存读取失败

如果我将第五行更改为: 字符名[2]

输入14个字符,返回相同的结果

同样地, 如果我将第五行更改为: 字符名[3]

输入15个字符,返回相同的结果


我知道这与aaray的大小有关,但是,我不知道括号中的数字如何与相应的输入字符数连接。有人能详细解释一下吗?

char name[1]的大小仅足以存储单个字符。如果尝试向其中存储多个字符,则剩余的字符将在数组结束后写入内存,这可能会覆盖“重要”数据,导致崩溃(或者更糟的是,损坏其他地方使用的数据)

字符串是包含0值终止符的字符值序列。如果要存储
N
-字符串,则需要分配一个宽度至少为
N
+1个元素的数组。因此,如果您想在
name
中存储最多13个字符的字符串,那么需要将其声明为

char name[14]; // +1 to hold the string terminator
仍然有可能在字符串中写入的字符数超过其大小,因此在输入端需要小心
scanf
允许您指定要读取的最大字符数:

scanf( "%13s", name ); // at most 13 characters read into name
不幸的是,该字段宽度不能用参数指定(在
printf
中可以这样)。另一种选择是根本不使用
scanf
,而是使用
fgets

fgets( name, sizeof name, stdin );

fgets
将从
stdin
读取不超过
sizeof name
-1个字符,并将它们写入
name
,然后将0终止符添加到
name
的末尾
sizeof name
计算为
name
中的字节数

屏幕上发生的奇怪事情是因为您指定了创建的数组“1”(即名称[1])的限制,因此输入最多只能有一个字符。您应该将数组的限制编辑为15个或更多(即字符名[15]),因此用户输入将增加到15个,因此最多可以输入15个字符。希望这有帮助

“我知道这与Aray的大小有关,但是,我不知道括号中的数字是如何与相应的输入字符数连接的。”它必须足够大,以适合您的输入,否则您会出现未定义的行为,这可能表现为您观察到的“奇怪的事情”。如果您的阵列不够大,程序可能仍会尝试,这可能会损坏其他地方的内存。如果您有一个可以容纳1升水的瓶子,但您尝试向其中倒入15升水,结果将是一团混乱。为了防止这种混乱,我们通过限制可以输入的内容来保护阵列。此处
scanf(“%1s”,名称)
添加的
1
是数组
字符名[1]中可用的存储字节数char name[31]
,然后使用
scanf(“%30s”,name)
#定义数组_基_长7#定义数组_长(数组_基_长+1)数组[数组_长];扫描频率(“%”#数组_基_长度“s”,数组)将是一个小技巧,以避免重复神奇的数字。不是很好,但是如果使用
scanf
一次读取多个不同的值,或者使用周围的上下文(@lydia:如果这样做,请始终检查实际读取的值的数量,即scanf的返回值!),可能会有所帮助。