【问题标题】:Problems in C with const char * and strcpy()C 中 const char * 和 strcpy() 的问题
【发布时间】:2021-01-14 01:17:32
【问题描述】:

我不明白为什么当我使用 char * ss 和 char * ss2 运行 strcpy (ss, ss2) 时,它会显示分段错误。 strcpy() 只是要求 2 个 char * 类型的 args,所以我不明白这个问题

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


int main()
{

  char *s;
  char *s2 = "hello";
  s = s2;
  printf ("s=%s\ns2=%s\n", s,s2);


  char *ss;
  char *ss2 = "hello";
  strcpy (ss, ss2);//why segmentation fault?
 
  printf("ss=%s\nss2=%s\n",ss,ss2);
}

return 0;

【问题讨论】:

标签: c strcpy


【解决方案1】:

您的第一个语句块有效,因为您将“hello”字符串的位置分配给s

在第二个语句块中,ss 有一个未定义的值,strcpy 尝试写入该位置,可能会导致分段错误。

为了使其工作,您可以将ss 声明为一个数组,也可以使用strncpy,因为它通常更安全。

char ss[10]; // This allocates 10 chars of space on the stack.
strncpy(ss, ss2, 10); // Do not copy more than 10 characters.

【讨论】:

  • strncpy 是一个糟糕的选择,因为它在某些情况下不会写入空终止符
  • 建议对未确定长度的缓冲区使用 malloc,如下所示。 字符* ss; ss = (char*)malloc(strlen(ss2)+1); strcpy(ss,ss2); …………;免费(ss);
【解决方案2】:

当你写作时

char *s;
char *s2 = "hello";
s = s2;

您将 s 作为指向 0 的 char 指针。然后将 s2 作为指向 hello 的 h 的 char 指针。然后 s 取 s2 的值,即 hello 的 h 的地址。

当你写作的时候

char *ss;
char *ss2 = "hello";
strcpy (ss, ss2);//why segmentation fault?

你有 ss 指向 0。你有 ss2 指向你好的 h。然后你要求 strcpy 函数将 hello 字符串放在地址 0。这是错误的。你应该为你的字符串分配足够的空间

char ss[6];

【讨论】:

  • ss 不指向 0 它是未初始化的……某些存储类被隐式初始化为 0……就像全局静态一样,但在函数内部它很可能是一个垃圾值。
  • 很有可能。其余的仍然正确。只需在我的答案中将 0 替换为垃圾值即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2014-11-12
  • 1970-01-01
  • 2017-03-30
  • 2012-03-22
相关资源
最近更新 更多