当执行此代码时,我得到了分段故障核心转储

时间:2018-07-12 05:52:54

标签: c

我遇到错误:分段错误核心已转储。

#include<stdlib.h>
#include<stdio.h>
char *strcpy(char *s,char *t)
{
  char *ptr = s;
  while((*s = *t) != '\0')
    s++;
  t++;
  return ptr;
}
int main()
{
  char *s = malloc(sizeof(char) * 12);
  char *t;
  scanf("%s",t);
  printf("%s",strcpy(s,t));
  return 0;
}

1 个答案:

答案 0 :(得分:5)

您会遇到分段错误,因为在分配内存以从用户获取输入之前,您正在使用char指针t

  char *t;
  scanf("%s",t); // using t before allocating memory

在使用之前分配内存:

char *t = malloc(sizeof(char) * 12);
if (NULL == t) {
    fprintf (stderr, "Failed to allocate memory");  
    exit(EXIT_FAILURE);
}

另一个问题出在函数strcpy()函数while循环中:

  while((*s = *t) != '\0')
     s++;

您尚未在循环主体中给出括号,因此仅将下一个next语句视为循环主体,并且此循环的每次迭代只会增加指针s,而指针t会继续指向字符串的第一个字符。在某个时刻,s循环的每次迭代中指针s++while)的增量将使s访问超出分配内存的内存,这是未定义的行为您可能会遇到细分错误。相反,您应该这样做:

  while((*s = *t) != '\0') {
      s++;
      t++;
  }

相当于

  while(*s++ = *t++)
  ;

原因是-后递增运算符将操作数的值增加1,但 [在这种情况下为指针] 表达式的值是操作数在进行增量操作之前的原始值。因此,在表达式*s++*t++中,指针st移动到下一个位置,但返回旧内容。表达式(*s++ = *t++)分配空终止符\0时,该表达式将产生\0,它等效于0,并且循环将终止。

此外,请确保在完成后释放动态分配的内存。因此,在调用字符串复制函数之后,您应该:

free(t);
free(s);

您也可以使用char数组来代替动态分配内存,例如:

char s[50];
char t[50];

使用此方法,您无需分配和释放内存。

提供与标准库函数名称相同的函数名称不是一个好习惯。最好给这样的名字-mystrcpy

此外,在复制字符串时,我们仅读取源字符串,因此应使源字符串参数const像这样:

char *mystrcpy (char *s, const char *t);
                         ^^^^^

避免像在程序中使用的那样使用单个字符变量名-st。遵循良好的编程习惯,请始终给出表示某些含义的名称,例如字符串复制函数中的参数名称,可以使用s代替destination,而使用{{而不是t 1}}。