我一直在写这样的东西

char *x=NULL;

假设

 char *x=2;

将创建一个指向地址2的char指针.

但是,在The GNU C Programming Tutorial中,它表示int *my_int_ptr = 2;在分配时将整数值2存储到my_int_ptr中的任意随机地址.

这似乎意味着我自己的char *x=NULL正在将NULL的值强制转换为char的值分配给内存中的某个随机地址.

虽然

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

int main()
{
    char *x=NULL;

    if (x==NULL)
        printf("是空的\n");

    return EXIT_SUCCESS;
}

事实上,它是输出吗

是空的

当我编译和运行它时,我担心我依赖于未定义的行为,或者至少是未指定的行为,因此我应该编写

char *x;
x=NULL;

取而代之的是.

推荐答案

Is it possible to initialize a C pointer to NULL?

是的,非常喜欢.


The actual claim made on the guide reads like

On the other hand, if you use just the single initial assignment, 100, the program will try to fill the contents of the memory location pointed to by 101 with the value 2. Since 101 is filled with garbage, it can be any address. [...]

他们错了,你是对的.

对于声明,(ignoring, for now, the fact that pointer to integer conversion is an implementation-defined behaviour)

int * my_int_ptr = 2;

my_int_ptr是一个变量(指向int的指针类型),它有自己的地址(类型:指向整数的指针的地址),您正在将值2存储到that地址中.

现在,my_int_ptr,作为一个指针类型,我们可以说,它points to存储位置pointed by处的"type"的值,也就是保存在my_int_ptr中的值.因此,您实质上是将指针变量赋给值of,而不是指针所指向的内存位置的值.

所以,作为结论

 char *x=NULL;

将指针变量x初始化为NULL,而不是value at the memory address pointed to by the pointer.

这是same as

 char *x;
 x = NULL;    

Expansion:

现在,在严格遵守的情况下,像这样的声明

 int * my_int_ptr = 2;

是非法的,因为它涉及到违反约束.我要说清楚的是,

  • my_int_ptr是指针变量,类型为int *
  • 根据定义,整型常量2的类型为int.

而且它们不是"兼容"类型,所以这个初始化是无效的,因为它违反了在第Lundin's answer章§6.5.16.1/P1中提到的简单赋值规则.

如果有人对初始化如何与简单赋值约束相关联感兴趣,请引用第11页第6.7.9章第C11

标量的初始值设定项应为单个表达式,可以 Select 用大括号括起来.这个

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

如何避免使用相对路径包含在c中

修改pGM使用指针填充2-D数组但不起作用

为什么信号量为空= 0,而不是阻塞?

ATmega328P USART发送字符重复打印

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

使用NameSurname扫描到两个单独的字符串

自定义应用程序上的日志(log)轮换问题

如何在C中从函数返回指向数组的指针?

使用双指针动态分配和初始化2D数组

将uintptr_t添加到指针是否对称?

轮询libusb_pollfd struct 列表的正确方式是什么?

Sizeof(&Q;字符串&Q;)的正确输出是什么?

GTK3按钮信号错误

在句子中转换单词的问题

I2C外设在单次交易后出现故障

在C中使用无符号整数模拟有符号整数

如何打印循环调度问题的时间表

我错误地修复了一个错误,想了解原因

在C中定义函数指针?