我的代码中存在细分错误,为什么以及如何解决?

时间:2018-08-27 18:59:09

标签: c segmentation-fault

我从这段代码中遇到了细分错误,有人可以告诉我这是什么问题吗?我遇到了分段错误,所以我假设我在某些时候弄乱了指针。它应该返回并在字符串中输出最大的数字。

它应该返回数字5。

#include <stdio.h> 
#include <string.h>    

int* greatest(char* string); 
int main() 
{   
   char *string = "This4 is5a 3wonderful2 day";
   int *p = 0;   
   p = greatest(string);
   printf("%d\n",*p);
}

int* greatest(char* string)
{
   int i = 0;
   int *poi = 0;
   while (*(string + i) != '\0')  
   {
       if(*(string + i) >= '0' && *(string + i) <= '9')
     {
       if(*((string + i)-48) > *poi)
       {
         *poi = *((string + i)-48);
       }
       }
     i++;
   }
   return poi;
 } 

这是执行代码后得到的:

  

“分段错误(核心已转储)”

2 个答案:

答案 0 :(得分:1)

主要问题是您设置了int *poi = 0;,然后尝试将值放入该位置。你不能那样做。指针必须指向存储位置,然后才能在其中存储值。 0NULL是无效的地址,用于将指针标记为未初始化。 (指针指向无处。)

要使其成为有效的指针,使其指向某物:

int *poi;
int p;

poi = &p;
*poi = 123;

(您也可以使用malloc为指针动态分配内存)。

我猜你应该返回一个char *,它应该指向字符串中一个字符的地址:

char* greatest(const char* string)
{
   // Safety check
   if (NULL == string) return NULL;

   char *poi = NULL;
   while (*string)  // Loop until string points to end-of-string ('\0')
   {
       if (*string >= '0' && *string <= '9') { // see also: isdigit
           if (NULL == poi)  { // poi hasn't been assigned yet
               poi = string;
           }
           // No need to convert to int. Can just compare char codes
           else if (*string > *poi) {
               poi = string;
           }
       }
       string++;
    }

    // At this point, poi either points to a char in string,
    // or NULL (if no digits in string)
    return poi;
}

然后将main更改为:

int main() 
{   
   const char *string = "This4 is5a 3wonderful2 day";
   char *p = greatest(string);
   // Check p before printing it
   if (NULL == p) {
       printf("No digits in: %s\n", string);
   }
   else {
       printf("%c\n", *p);
   }
}

答案 1 :(得分:0)

#include <stdio.h>
#include <string.h>



int greatest(char* string);
int main()
{
  char *string = "This4 is5a 3wonderful2 day";
  int p = 0 ;
  p = greatest(string);
  printf("%d\n",p);

}

int greatest(char* string)
{
  int i = 0;
  int poi = 0 ;
  while (string[i] != '\0')
  {  
    if((string[i]) >= '0' && *(string + i) <= '9')
    {
      if(((string[i])-'0') > poi)
      {
       poi = ((string [i])-'0');
      }  
    }
    i++;
  }
  return poi;
}

我想我必须这样做。我想返回一个指针,但是如果我找不到答案,那会很好,我会继续尝试。也感谢您的帮助,拥有令人赞叹的人的令人惊叹的网站