c - 以下C代码编译并运行,但它是未定义的行为吗?
问题描述
我发布了一个关于我之前在这个问题中遇到的一些指针问题的问题: C int pointer segmentation fault several scenario, can't explain behavior
从一些评论中,我被引导相信以下几点:
#include <stdlib.h>
#include <stdio.h>
int main(){
int *p;
*p = 1;
printf("%d\n", *p);
return 0;
}
是未定义的行为。这是真的?我一直这样做,我什至在我的 C 课程中看到过。但是,当我这样做时
#include <stdlib.h>
#include <stdio.h>
int main(){
int *p=NULL;
*p = 1;
printf("%d\n", *p);
return 0;
}
p
在打印(在行之后)的内容之前,我得到了一个段错误*p=1;
。这是否意味着我应该一直malloc
ing 任何时候我实际为指向的指针分配一个值?
如果是这样,那为什么char *string = "this is a string"
总是有效?
我很困惑,请帮助!
解决方案
这:
int *p;
*p = 1;
是未定义的行为,因为p
没有指向任何地方。它是未初始化的。因此,当您尝试取消引用时,p
您实际上是在写入随机地址。
未定义的行为意味着无法保证程序会做什么。它可能会崩溃,它可能会输出奇怪的结果,或者它可能看起来工作正常。
这也是未定义的行为:
int *p=NULL;
*p = 1;
因为您试图取消引用 NULL 指针。
这有效:
char *string = "this is a string" ;
因为您正在string
使用字符串常量的地址进行初始化。这与其他两种情况不同。其实和这个是一样的:
char *string;
string = "this is a string";
请注意,这里string
没有被取消引用。指针变量本身被赋值。
推荐阅读
- javascript - jquery选择器不适用于动态值
- c# - ASP .NET MVC 5 - 如何在 Ajax.ActionLink 中添加表单模型?
- c# - 当属性具有'@'时如何在 XSL 中获取值
- python - 减去时间列
- python - 嵌套字典 Python:更新逻辑失败
- django - 如何在颤振中执行延迟加载或无限加载?
- mysql - 如何使用 2 个 csv 信息创建 csv?
- elasticsearch - 如果它是今天独有的,如何在 Kibana 中绘制一些东西?
- sql - Flutter 从 SQLite 获取数据到对象/模型中
- java - 在java中使用正则表达式在整数和'/'之间放置空格