【问题标题】:C Segmentation Fault when trying strcpy on char *pointer [duplicate]在 char *pointer 上尝试 strcpy 时出现 C 分段错误 [重复]
【发布时间】:2014-05-05 21:18:46
【问题描述】:

我是学习 C 语言的新手,我对指针有疑问。

例如,如果我尝试这个:

char *pointer;
strcpy(pointer,"Hello, World!\n");
printf(pointer);

我得到这个输出:

Segmentation Fault

但如果我试试这个:

char *pointer = "Hello, World!\n");
printf(pointer);

我明白了:

Hello, World!

我的问题是为什么它不适用于strcpy。 功能总体上是一样的。

第一个源代码和第二个源代码有什么区别?

如果有人能解释一下内存中发生的事情,那就太好了,这样我就可以更好地了解这一点。

【问题讨论】:

标签: c memory string pointers


【解决方案1】:

char* pointer 只是为您提供了一个用于访问内存位置的变量。您尚未分配任何内存,因此当您执行 strcpy 时,您正在写入 pointer 具有的任何随机/未定义值。

您需要执行以下操作:

char* pointer = calloc(LEN);
if (pointer)
{
    strcpy(pointer, "Hello World");
    printf(pointer);
    free(pointer);
}

【讨论】:

  • 使用strncpy() 会更安全。
  • 啊,好的。所以假设我有char *pointer,那么我内存中的指针地址是例如0xBFFFF800,但是在这个地址是一个随机值,那么指针指向保存在0xBFFFF800的随机位置对吗?
  • @user3605865 是的,下一个字节可能是任何东西。它可能是你的操作系统的关机钩子,它可能是启动全球热核战争的控制代码(如果它是一台运行这种软件的计算机)......这就是为什么你应该总是分配内存,以防止尝试写入(或读出)你不应该访问的内存。
  • calloc 有 2 个参数,所以使用 calloc(LEN, 1)
  • 我明白了。谢谢你们!你在哪里有很大的帮助:*
【解决方案2】:

“strcpy”的第一个参数应该指向内存中的一个可用位置。在您的第一个源代码中,您还没有初始化指向任何东西的“指针”。您应该首先对其进行初始化,例如将其声明为最大长度的字符数组:

char myArray[42]; // where 42 represents the maximum capacity

【讨论】:

  • 好点——已更正
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2018-03-17
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多