【问题标题】:strcpy pass initialized null pointer c [duplicate]strcpy传递初始化的空指针c [重复]
【发布时间】:2016-10-30 03:57:56
【问题描述】:

我正在尝试以下代码:

int main()
{
   char *yo = "yo";
   char *whaddup = NULL;
   strcpy(whaddup,yo);
}

我得到一个段错误。在这里完成 C noob - 其他地方说我应该将 whaddup 初始化为一个数组。为什么我不能传入指向 null 的指针?

【问题讨论】:

  • 同样的原因你不能做char *whaddup = NULL; *whaddup = 'a'; 例如。这也是你不能做int *whaddup = NULL; *whaddup = 4;的原因
  • @immibis 请问这是什么原因?
  • NULL 指针不指向任何东西
  • @immibis 但我们可以做char *in = NULL; in = fgets(you.first_name, 100, stdin); 其中you 是一些结构。这是否意味着我们可以分配一个指向变量in 的指针以使其指向其他地方,而不是文字?
  • 好吧,in 在您为其分配了非 NULL 的内容后,它不包含 NULL。如果我这样做 int in = 5; in = 4; 然后在此运行后包含 4,并且不包含 5。in = something;*in = something; 不同 - 后者不会修改 in

标签: c strcpy


【解决方案1】:

任何strcpy 文档都会告诉您,目标字符串应该是一个足够大的char 数组以容纳字符串和NUL 终止符。

所以你需要的是类似的东西

char* yo = "yo";
char* whaddup = malloc(strlen(yo)+1);
strcpy(whaddup, yo);

或者您也可以使用 strdup 函数为您执行此操作,但它不是标准的,因为它只是 POSIX。

【讨论】:

  • 我只包含 sizeof(char) 来演示概念内存分配,但是是的 @user2635088 一个字符是一个字节,所以你不需要它。当您开始分配 int、double 等时,养成使用它的习惯是安全的。
【解决方案2】:

您必须将whaddup 声明为字符数组,或者使用malloc 为其分配空间。

int main()
{
   char *yo = "yo";
   char *whaddup = malloc(sizeof(char) * 8); // buffer for 8 characters
   strcpy(whaddup,yo);
}

通过将whaddup 初始化为NULL,您并没有给它任何内存空间,因此即使将一个字符复制到其中也会导致分段错误。

【讨论】:

    【解决方案3】:

    你可以传入一个指向null的指针,但你不能将字符串从指针复制到null。

    函数char* strcpy(char* dest, const char* src)是将字符串从地址src复制到地址dest,你的destnull

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2016-03-12
      • 2017-08-26
      相关资源
      最近更新 更多