我遇到错误:分段错误核心已转储。
#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;
}
答案 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++
中,指针s
和t
移动到下一个位置,但返回旧内容。表达式(*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);
^^^^^
避免像在程序中使用的那样使用单个字符变量名-s
和t
。遵循良好的编程习惯,请始终给出表示某些含义的名称,例如字符串复制函数中的参数名称,可以使用s
代替destination
,而使用{{而不是t
1}}。