简体   繁体   中英

my Program received signal SIGSEGV, Segmentation fault, help please

When I try to run this program, it doesn't work. When I go to debugs, a message pops up "program received signal sigsegv, segmentation fault"

i debug the programe with gdb, and this is the messages. Program received signal SIGSEGV, Segmentation fault. 0x0000555555555195 in ft_atoi (str=0x555555556004 "111") at ft_atoi.c:33 33 while (ft_isspace(str[i]))

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

static int ft_isspace(char c)
{
  if (c == '\n' || c == '\f' || c == ' ' ||
      c == '\r' || c == '\v' || c == '\t');
  return (1);
  return (0);
}
 
int ft_atoi(const char *str)
{
  int               i;
  int               n;
  int               signe;

  n = 0;
  i = 0;
  signe = 1;
  while (ft_isspace(str[i]))
    i++;
  if (str[i] == '-' || str[i] == '+')
    {
      if (str[i++] == '-')
    signe = -1;
    }
  while (str[i] >= '0' && (str[i] <= '9') && str[i] != '\0')
    {
      if (((unsigned long)n > 9223372036854775807 / 10) ||
      (((unsigned long)n == 9223372036854775807 / 10) &&
       ((unsigned long)n % 10) > 7))
    return ((signe > 0 ? -1 : 0));
      n = n * 10 + (*(str + (i++)) - '0');
    }
  return (n * signe);
}
int main()
{
  printf("%d", ft_atoi("111"));
  return 0;
}
static int ft_isspace(char c)
{
  if (c == '\n' || c == '\f' || c == ' ' ||
      c == '\r' || c == '\v' || c == '\t');
  return (1);
  return (0);
}

This will always return 1, causing the loop to run off the end. Notice the semicolon here:

      c == '\r' || c == '\v' || c == '\t'); <-- HERE

Imagine if it looked like this:

      c == '\r' || c == '\v' || c == '\t') j=2;

That would cause the if statement to decide whether j=2 is executed. And the return on the next line would execute regardless of the results of the if .

Well your code does that same thing, except instead of j=2 , you have an empty statement.

The syntax is: if <expression> <statement>

Your expression ends with that last close parenthesis. So your controlled statement is just the ; .

Just remove that semicolon so the return is the statement that is controlled by the if and that appears immediately after the expression.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM