将字母表保存在数组中会出现堆栈粉碎错误
Saving alphabet in array gets stack smashing error
这是一个简单的小程序,用于保存和显示数组中的所有 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)
该代码有什么问题?
问题很简单,数组 alpha
被创建为大小为 52 个元素,但是您在循环中插入了最后一个元素的末尾,因为您增加了数组索引变量 j
在 if
语句的 之外。像这样向数组添加元素时,将 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]
并写入数组边界会导致未定义的行为。
如果您使用了调试器,这从一开始就很明显。
这是一个简单的小程序,用于保存和显示数组中的所有 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)
该代码有什么问题?
问题很简单,数组 alpha
被创建为大小为 52 个元素,但是您在循环中插入了最后一个元素的末尾,因为您增加了数组索引变量 j
在 if
语句的 之外。像这样向数组添加元素时,将 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]
并写入数组边界会导致未定义的行为。
如果您使用了调试器,这从一开始就很明显。