为阵列分配的动态内存大小是多少? 例如,我们必须打印一个len = 4
的数组int i, n, len = 4;
char *s = malloc(len * sizeof(char));
strcpy(s, "aaabbcc");
n = strlen(s);
printf("%d", n);
输出应为4
,但输出的所有时间均为7
。
答案 0 :(得分:1)
在C中,您必须为数据分配固定大小的缓冲区。在您的情况下,您为字符串分配了len * sizeof(char)
,其中len = 4
个字节。
来自strcpy的文档:
char * strcpy(char * destination,const char * source);
复制字符串将源指向的C字符串复制到数组中 目标指向,包括终止空字符(和 在那一点停下来。)
为避免溢出,目标指向的数组大小应为 足够长,可以包含与源相同的C字符串(包括 终止空字符),并且不应该在内存中重叠 源。
将大小为8("aaabbcc"
和隐式空终止符)的字符串复制到大小为4的缓冲区中。这就是所谓的buffer overflow;您将字符串复制到小于字符串要求的缓冲区中。
strlen
在字符串中查找空终止符以查找字符串大小。它读取缓冲区溢出字符串,这就是为什么它返回7:缓冲区溢出字符串的大小减去空终止符的一个。
请注意,分配正确大小的缓冲区似乎并不重要,但这样做至关重要。溢出的值可以在内存中重写或覆盖其他内存,从而导致未定义的行为。