c中的char指针导致分段错误

时间:2014-05-01 15:05:12

标签: c segmentation-fault

我对C很新,所以也许有人可以解释为什么我在这个程序中遇到分段错误:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char *username = "hello";
    char *other;
    *other = *username;

    return 0;
 }

为什么会出现这种错误?

2 个答案:

答案 0 :(得分:3)

other尚未初始化。它指向内存中的一些随机点,你在那里贴了一个角色。

您需要为other分配一些空间:

char *other = malloc(6);  // or 1, or however much space you'll eventually need
*other = *username;  
// first char at `other` is now 'h'; the rest is unknown. To make it valid string,
// add a trailing '\0'
other[1] = '\0';

或者如果您正在尝试制作重复的字符串:

char *other = strdup(username);

或者如果您尝试将other指向与username相同的位置:

char *other = username;

答案 1 :(得分:0)

"Okay as I understand it char *username = "hello"; 
 automatically allocates a place for the string."

更好地定义单词&#39;它可能会有所帮助。 (如上句所用);这是编译器&#39; (没有深入思考链接器和加载器)。这意味着编译器为静态字符串准备一个位置&#34; hello&#34; 之前程序执行。例如,你可以&#39; grep&#39;可执行文件并发现可执行文件包含字符串&#39; hello&#39;。

当程序被操作系统加载到内存时,“堆”&#39;在程序可以动态分配内存的地方建立。

静态字符串&#34;你好&#34;不是堆的一部分;并没有分配&#39;在运行时动态。相反,它被分配了#39;在编译时静态。

静态值,例如字符串&#34; hello&#34;,不能通过&#39; realloc()&#39;调整大小,或者由&#39; free()&#39;释放。因为这些函数仅适用于从堆中分配的项目,而不是静态&#34;编译时间&#34;分配。


以下代码声明了一个静态字符串&#34; hello&#34;。 它还声明了一个字符指针&#39; username&#39;,并将指针初始化为指向静态字符串。

char *username = "hello";

以下代码声明了一个字符指针&#39;其他&#39;,并使其保持未初始化状态。做那个&#39;其他&#39;是未初始化的,指针总是指向某个地方;很可能是未初始化的其他&#39;指针指向一个随机的内存位置(实际上并不存在)。

char *other;

以下一行尝试将一个字符(&#39; h&#39;)从用户名指向的地方复制到其他&#39;其他地方。指向(实际上不存在的随机存储位置)。

*other = *username;

这就是生成“分段错误”的原因。


仅供参考,以下陈述会引起指针&#39;用户名&#39;和其他&#39;指向同一个地方,静态字符串&#34;你好&#34;:

char *other;
other = username;

......与以下内容相同:

char *other = username;

如果你愿意,你可以导致&#34;你好&#34;要从堆中分配(在运行时),如下所示:

char *username = strdup("hello");

如果您希望在其他&#39;

中使用其他副本
char *other = strdup("hello");