这是一个简单的程序,可以保存并显示数组中的所有ASCII字母:
#include <stdio.h>
int main(void) {
int j = 0;
char alpha[52];
for (i=65;i<=122;i++) {
if (i<=90 || i>=97) {
alpha[j] = i;
}
j++;
}
printf("\n");
return 0;
}
收到以下错误:
*** stack smashing detected ***: ./program.c terminated
Canceled (Created core dump)
该代码有什么问题?
答案 0 :(得分:2)
问题很简单,数组alpha
被创建为大小为52的元素,但是你要插入循环中最后一个元素的末尾,因为你增加了数组索引变量j
< if
语句的strong>外部。在向数组中添加元素时,将j
增量代码移动到if
块中
for (i=65;i<=122;i++)
{
if (i<=90 || i>=97)
{
alpha[j] = i;
j++; /* place the increment here */
}
/* instead of here */
}
这确保您只在实际写入数组时增加j
。如果不这样做会导致j
变得大于51,这是您可以写入的最高索引,而不会越过数组末尾。
您的代码可以使j
超过51,此时i
的值也在满足您的if
条件的范围内 - 所以您写入alpha[j]
并且写过数组边界会导致未定义的行为。
如果您使用过调试器,那么从一开始就很明显。