【发布时间】:2021-11-26 09:12:15
【问题描述】:
我知道这个问题已经被问过一百万次了,但我仍然感到困惑。我故意使我的字符串大小等于其中的字符数:
int main()
{
int i = 0;
char str[5] = "check";
while((str[i] != '\0') && (i != 10)){ // (i != 10) aborts the func
printf("str[i] = %c\n", *(str+i));
printf("i = %d\n", i);
i++;
}
}
输出是:
str[i] = c
i = 0
str[i] = h
i = 1
str[i] = e
i = 2
str[i] = c
i = 3
str[i] = k
i = 4
尽管没有分配空间,为什么它仍然在末尾存储空字符?它取决于编译器,还是它们都以相同的方式工作?
【问题讨论】:
-
这是未定义的行为。
-
您的代码之所以起作用,是因为偶然地,在您的数组之后分配的内存仍然是空的并初始化为空。情况可能并非总是如此。在为字符串存储定义数组时,您必须在末尾允许一个额外的字符来存储 NULL。
标签: c string memory-management null