首页 > 解决方案 > 以下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;。这是否意味着我应该一直mallocing 任何时候我实际为指向的指针分配一个值?

如果是这样,那为什么char *string = "this is a string"总是有效?

我很困惑,请帮助!

标签: cpointersundefined-behavior

解决方案


这:

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没有被取消引用。指针变量本身被赋值。


推荐阅读