【发布时间】:2022-01-22 14:47:45
【问题描述】:
int main ()
{
char *strA = "abc";
int tam_strA = strlen(strA);
char strB[tam_strA];
strB[0] = 'a';
strB[1] = 'b';
strB[2] = 'c';
strB[3] = 'd';
strB[9] = 'z';
printf("%c", strB[9]);
return 0;
}
它正常打印'z'。为什么它不返回分段错误错误?因为我试图访问一个不应该存在的索引,因为 strB 的大小(索引数量)等于 tam_strA 等于 3。
另外,改用char strB[strlen(strA)]; 有什么不同/问题吗?
【问题讨论】:
-
意外行为意味着任何事情都可能发生。您的代码演示了一种可能的行为;还有无数其他的。如果您通过
strA打印,您可能会遇到崩溃。 -
如果
strB[9]位于不属于您的内存中,并且硬件配置为导致系统故障,则会发生这种情况。但是,如果strB[9]在您拥有的内存中,则除非存在使用该内存位置的竞争,否则不会引起问题。如果您不干扰任何其他用途(反之亦然),就不会有问题。假设您去剧院并坐在您没有预订的座位上。如果没有其他人愿意使用同一个座位,您可能会喜欢整个节目,否则会有麻烦。 -
C 不能保护您免于射中自己的脚(这样做时称为未定义行为)。 C 不为您检查所有内容背后的想法是,您可以在需要时检查自己......当您不需要时,您编译的程序被设计简化。
-
请选择一个标题,该标题提供有关您的问题的信息,而不是笼统的陈述。谢谢。