gpt4 book ai didi

c - 执行此代码时,我得到了段错误核心转储

转载 作者:行者123 更新时间:2023-11-30 20:46:40 25 4
gpt4 key购买 nike

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

#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;
}

最佳答案

您遇到段错误,因为您在为其分配内存以获取用户输入之前使用了 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++;

您没有在循环体中给出括号,因此只有变化的下一个语句被视为循环体,并且该循环的每次迭代只会增加指针s和指针t 将继续指向字符串的第一个字符。在某一时刻,while 循环的每次迭代中指针 s (s++) 的增量将使 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。遵循良好的编程实践,始终给出表示某种含义的名称,例如字符串复制函数中的参数名称,您可以给出 destination 而不是 s,而不是 t 您可以提供源代码

关于c - 执行此代码时,我得到了段错误核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51298185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com