我有这段代码:
void printArray(char* p, int len)
{
for( p ; p < p + len ; p++ )
{
printf("%c", *p);
}
printf("\n");
}
int main()
{
char* abc = "abcdefghijklmnopqrstuvwxyz";
printArray(abc, 26);
return 0;
}
这是假设要打印所有英文字母,但是有一个运行时错误,我需要找到它的原因以及如何解决它。 我已经尝试了任何我想到的东西来解决它,但没有任何帮助,它只是打印了很多随机的东西。 我在这里先向您的帮助表示感谢。 P.S:这不是我写的代码,我只需找到错误并修复它。
答案 0 :(得分:2)
停止的条件
p < p + len
不会是错误的,因为在循环的每次迭代中都会p++
。您最终访问无效的内存位置,这会导致未定义的行为和这导致运行时错误。要修复它,请使用另一个变量
char *tmp=p+len;
并将条件更改为
p < tmp
另一种方法是在每次迭代中递减len
。 len
为零后退出循环:
void printArray(char* p, int len)
{
for( p ; len ; --len )
{
printf("%c", (*p)++);
}
printf("\n");
}
答案 1 :(得分:1)
每次循环迭代都会计算表达式p + len
,每次使用递增的值p
。这使循环超出了数组的范围,触发了未定义的行为。
您需要预先计算一个超出循环外结束点的那个
char* end = p + len;
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
答案 2 :(得分:1)
下面:
for( p ; p < p + len ; p++ )
p < p + len
永远是真的。
您需要以下内容:
void printArray(char* p, int len)
{
char *end = p + len; /* sum before the for loop */
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
printf("\n");
}
但是您不需要传递长度,只需迭代直到找到尾随\0
,如果您不打算修改传递的字符串,请使用const char *
:
void printArray(const char *p)
{
while (*p) {
printf("%c", *p++);
}
printf("\n");
}