数组限制不起作用

时间:2012-08-28 00:45:08

标签: c arrays

我写了这个小程序来练习数组,它应该最多包含10个字符,结尾为\ 0。它工作正常,但它工作得很好,即使我输入一个50个字符的名字,它也会输出正确的输入。是什么给了什么?

#include <stdio.h>


int main(int argc, char const *argv[])
{
char name[11];

printf("Enter your name: ");
scanf("%s", name);

printf("Hi, %s\n", name);   
return 0;
}

2 个答案:

答案 0 :(得分:8)

你覆盖了你分配的数组的末尾 - 你需要指定scanf的一部分,读取字符串的长度,以确保它适合。

scanf("%10s", name);

对代码的改进是生成格式字符串,以便始终具有正确的大小。

#include <stdio.h>


int main(int argc, char const *argv[])
{
char name[11];
char formatstr[50];

snprintf(formatstr, sizeof(formatstr), "%%%ds", sizeof(name)-1);

printf("Enter your name: ");
scanf(formatstr, name);

printf("Hi, %s\n", name);
return 0;
}

答案 1 :(得分:1)

当您在 C 中分配数组时,您只需获取一块内存块的起始内存地址,保证您可以免费使用,仅此而已。这种保证是基于您不打算使用此数组读取/写入其边界之外的任何内存位置的假设,您刚才这样做了!

当您尝试访问数组边界之外的内存位置时,更高级别的语言(例如 Java C#)将引发异常(错误)在 C ,你是独立的。

即使您的示例似乎无害,但这种access violation是软件开发中的常见错误,可能会导致从简单的故障转变为意外stack-overflow