我一直在写这样的东西
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("is NULL\n");
return EXIT_SUCCESS;
}
实际上,打印
为空
当我编译和运行它时,我担心我依赖于未定义的行为,或者至少是未指定的行为,并且我应该编写
char *x;
x=NULL;
而不是。
发布于 2017-04-11 14:18:55
是否可以将C指针初始化为NULL?
TL;Dr.是的,非常喜欢。
另一方面,如果您只使用单个初始赋值
int *my_int_ptr = 2;
__,程序将尝试用值2填充my_int_ptr
指向的内存位置的内容。因为my_int_ptr
充满了垃圾,所以它可以是任何地址。..。
好吧,他们是错的,你是对的。they wrong,你是对的。
对于语句,(目前,忽略指向整数转换的指针是实现定义的行为)
int * my_int_ptr = 2;
my_int_ptr
是一个变量(指向int
的指针类型),它有自己的地址(类型:指向整数的指针的地址),您正在将2
的值存储到该地址中。
现在,my_int_ptr
,作为一个指针类型,我们可以说,它指向my_int_ptr
中保存的值所指向的内存位置上的“Type值”。因此,您实际上是在分配指针变量的值,而不是指针所指向的内存位置的值。
所以,作为结论
char *x=NULL;
将指针变量x
初始化为NULL
,而不是指针指向的内存地址处的值。
这是与相同的
char *x;
x = NULL;
扩展:
现在,为了严格遵守,像这样的语句
int * my_int_ptr = 2;
是非法的,因为它涉及到违反约束。先说清楚,
根据定义,
my_int_ptr
是一个指针变量,类型为int *
2
的类型为int
。而且它们不是“兼容”类型,所以这个初始化是无效的,因为它违反了Lundin's answer中描述的§6.5.16.1/P1章中提到的简单赋值规则。
如果任何人对初始化如何链接到简单的赋值约束感兴趣,请引用C11
,第6.7.9章,P11
标量的初始值设定项应该是单个表达式,可以选择将其括在大括号中。对象的初始值是表达式的初始值(转换后);应用与简单赋值相同的类型约束和转换,将标量的类型作为其声明类型的非限定版本。
发布于 2017-04-11 14:26:50
教程是错误的。在ISO中,int *my_int_ptr = 2;
是一个错误。在GNU中,它的意思与int *my_int_ptr = (int *)2;
相同。这将以编译器确定的某种方式将整数2
转换为内存地址。
它不会尝试在由该地址寻址的位置(如果有的话)中存储任何内容。如果您继续编写*my_int_ptr = 5;
,那么它将尝试将数字5
存储在该地址所寻址的位置。
发布于 2017-04-11 15:13:09
为了澄清为什么教程是错误的,int *my_int_ptr = 2;
是一个“约束冲突”,它是不允许编译的代码,编译器必须在遇到它时给你一个诊断。
根据6.5.16.1的简单分配:
约束应满足以下条件之一:
在这种情况下,左操作数是一个非限定指针。它没有提到右操作数可以是整数(算术类型)。因此,该代码违反了C标准。
众所周知,GCC的行为很糟糕,除非你显式地告诉它是一个标准的C编译器。如果您将代码编译为-std=c11 -pedantic-errors
,它将像它必须做的那样正确地给出诊断。
https://stackoverflow.com/questions/43338084
复制相似问题