我对C很新,所以也许有人可以解释为什么我在这个程序中遇到分段错误:
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *username = "hello";
char *other;
*other = *username;
return 0;
}
为什么会出现这种错误?
答案 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");