字符和整数指针之间的初始化差异

时间:2013-10-26 20:06:35

标签: c

这没有运行时错误

int main()
{
    char *p = "Hello"; 
} 

这会产生运行时错误

int main()
{
   int *p; 
   *p = 5; 
}

我无法理解为什么会这样。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您的第一个示例将指针p指向文字字符串,因此p指向有效内存。

您的部分声明了指针p,但未指向任何内存地址。然后是下一个语句*p = 5解除引用p,它试图将5存储在指针p中存储的内存地址中。由于您没有将p指向有效内存,因此应用程序崩溃。

答案 1 :(得分:2)

您的第二个代码段是未定义的行为,因为指针未初始化。

你的第一个片段也可能让你遇到麻烦:你应该写const char *p = "Hello";。这是因为字符串文本将被C运行时库添加到字符串文字表中。它是未定义的行为来修改它。使用const有助于强制执行此操作。

答案 2 :(得分:1)

第一个程序设置指针的值,并且是明确定义的(只要你不尝试修改字符串)。

第二个程序通过未初始化的指针指定一个值(因此具有undefined behaviour)。

以下是第一个程序的粗略等效项,但使用int

int main()
{
   int val = 5;
   int *p = &val;
}