我有这个代码:
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:这不是我写的代码,我只需要找到错误并修复它。
停止的条件
p < p + len
不会像在循环的每次迭代中执行p++
那样为false。您最终访问了无效的内存位置,这会导致"未定义的行为"one_answers"这就是导致运行时错误的原因"。要修复它,请使用另一个变量
char *tmp=p+len;
并将条件更改为
p < tmp
另一种方法是在每次迭代中递减CCD_ 2。一旦len
为零时退出循环:
void printArray(char* p, int len)
{
for( p ; len ; --len )
{
printf("%c", (*p)++);
}
printf("n");
}
每次循环迭代都会使用p
的增量值来计算表达式p + len
。这使得循环超出数组的边界,从而触发未定义的行为。
你需要预先计算一个超过终点的循环
char* end = p + len;
for( p ; p < end ; p++ )
{
printf("%c", *p);
}
此处:
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");
}
但您不需要传递长度,只需迭代,直到找到尾部的