C指针算术分段错误仅在for循环内部

C指针算术分段错误仅在for循环内部,c,C,我试图写一个函数,检查一个数字是否是回文。(欧拉项目)。我决定编写一个函数,将数字转换为字符串,并使用两个指针向前和向后遍历字符串。但是,在尝试添加到for循环内的指针时,我总是遇到分段错误 int isPalindromeNumber(int number) { char* str; itoa(number, str, 10); int length = strlen(str); int isPalindrome = 1; char* forwardP

我试图写一个函数,检查一个数字是否是回文。(欧拉项目)。我决定编写一个函数,将数字转换为字符串,并使用两个指针向前和向后遍历字符串。但是,在尝试添加到for循环内的指针时,我总是遇到分段错误

int isPalindromeNumber(int number)
{
    char* str;
    itoa(number, str, 10);
    int length = strlen(str);
    int isPalindrome = 1;

    char* forwardPtr = str;
    char* backwardPtr = str + (length - 1);

    for (int i = 0; i < length / 2; i++)
    {
        if (*forwardPtr != *backwardPtr)
        {
            isPalindrome = 0;
        }

        // Segfault here.
        forwardPtr += 1;
        backwardPtr -= 1;
    }

    return isPalindrome;
}
int-isPalindromeNumber(int-number)
{
char*str;
itoa(编号,str,10);
int长度=strlen(str);
int isPalindrome=1;
char*forwardPtr=str;
char*backardptr=str+(长度-1);
对于(int i=0;i
但是,如果我在for循环之前尝试递增/递减这些指针,就不会有问题。我也尝试过将for循环限制为仅一次迭代,但它仍然存在故障

我觉得这是一个简单的问题,但我似乎找不到任何类似的问题。因此,任何帮助或重定向都是非常感谢的

变化

  char* str;

在您的代码中,没有指向任何地方的指针。此更改使本地缓冲区足够大,可以容纳32位整数的字符串版本更改

  char* str;


在您的代码中,没有指向任何地方的指针。此更改使本地缓冲区足够大,可以容纳32位整数的字符串版本。无需使程序复杂化。您可以通过将数字以相反顺序存储在任何其他变量中,然后比较这两个变量来轻松完成此操作

但是,我仍然尊重你们的问题,我认为你们正在努力学习指针,所以我会帮助你们

    #include<stdio.h>
 ' int main(){
         char string[40];
         char *ptr,*rev;
         clrscr();
         printf("\nGive a string : ");
         gets(string);
         ptr=string;
         while(*ptr!=NULL){
         ++ptr;
         }
         --ptr;
         for(rev=string; ptr>=rev;){
         if(*ptr == *rev)
         {
         --ptr;
         rev++;
         }
         else
         break;
         }
         if(rev>ptr)
         printf("\nThe given string %s is Palindrome",string);
         else
         printf("\nThe given string %s is not Palindrome",string);
         getch();
         return(0);
         } '

  It just a issue of memory allocation change *str to str[size] it will work
#包括
'int main(){
字符串[40];
字符*ptr,*rev;
clrsc();
printf(“\n输入字符串:”);
获取(字符串);
ptr=字符串;
while(*ptr!=NULL){
++ptr;
}
--ptr;
对于(rev=string;ptr>=rev;){
如果(*ptr==*版本)
{
--ptr;
rev++;
}
其他的
打破
}
如果(版本>ptr)
printf(“\n给定的字符串%s是回文的”,字符串);
其他的
printf(“\n给定的字符串%s不是回文”,字符串);
getch();
返回(0);
} '
这只是一个内存分配的问题,将*str改为str[size]就行了

无需使程序复杂化您可以轻松地将数字以相反顺序存储在任何其他变量中,然后比较两个变量

但是,我仍然尊重你们的问题,我认为你们正在努力学习指针,所以我会帮助你们

    #include<stdio.h>
 ' int main(){
         char string[40];
         char *ptr,*rev;
         clrscr();
         printf("\nGive a string : ");
         gets(string);
         ptr=string;
         while(*ptr!=NULL){
         ++ptr;
         }
         --ptr;
         for(rev=string; ptr>=rev;){
         if(*ptr == *rev)
         {
         --ptr;
         rev++;
         }
         else
         break;
         }
         if(rev>ptr)
         printf("\nThe given string %s is Palindrome",string);
         else
         printf("\nThe given string %s is not Palindrome",string);
         getch();
         return(0);
         } '

  It just a issue of memory allocation change *str to str[size] it will work
#包括
'int main(){
字符串[40];
字符*ptr,*rev;
clrsc();
printf(“\n输入字符串:”);
获取(字符串);
ptr=字符串;
while(*ptr!=NULL){
++ptr;
}
--ptr;
对于(rev=string;ptr>=rev;){
如果(*ptr==*版本)
{
--ptr;
rev++;
}
其他的
打破
}
如果(版本>ptr)
printf(“\n给定的字符串%s是回文的”,字符串);
其他的
printf(“\n给定的字符串%s不是回文”,字符串);
getch();
返回(0);
} '
这只是一个内存分配的问题,将*str改为str[size]就行了

您需要为
str
分配内存,我对
itoa()
调用中没有发生崩溃感到有点惊讶,但这对你来说是未定义的行为。@Fredrarson明天可能会崩溃。你需要为
str
分配内存。我有点惊讶,崩溃没有发生在
itoa()
调用上,但这对你来说是未定义的行为。@Fredrarson明天它在base-10中表示时可能会崩溃,是的,谢谢!不过,我还是有点困惑代码以前是如何工作的。。如果我打印出这两个指针的初始解引用值,它将生成预期值。我还尝试了加减法,效果也很好。你知道为什么会这样吗?欢迎来到未定义行为的世界,试着改变你原始代码中声明事物的顺序,行为会改变。(将int-length移到char*str之前,看看会发生什么)当用base-10表示时,也就是说。谢谢!不过,我还是有点困惑代码以前是如何工作的。。如果我打印出这两个指针的初始解引用值,它将生成预期值。我还尝试了加减法,效果也很好。你知道为什么会这样吗?欢迎来到未定义行为的世界,试着改变你原始代码中声明事物的顺序,行为会改变。(将int-length移到char*str之前,看看会发生什么)