假设我有一个数组(函数的本地)和一个指针
char a[]="aesdf" 和 char *b="asdf"
我的问题是,在前一种情况下,字符串文字"aesdf"是存储在只读部分,然后复制到本地数组还是类似于
char a[]={'a','e','s','d','f','\0'}; ?
我认为在这种情况下,字符直接在堆栈上创建,但在前面的case(char a[]="aesdf")中,字符从只读部分复制到本地数组.
在可执行文件的整个生命周期中是否存在"aesdf"?
从抽象和形式的角度来看,每个字符串文字都是一个具有静态存储持续时间的独立无名对象.这意味着,初始化char a[] = "aesdf"正式创建文字对象"aesdf",然后使用它初始化独立数组a,即它不等效char *a = "aesdf",其中指针直接指向字符串文字.
但是,由于字符串文字是无名对象,因此在char a[] = "aesdf"变体中,无法"aesdf"在初始化之前或之后访问独立对象.这意味着您无法"检测"此对象是否确实存在.该对象的存在(或不存在)不会影响程序的可观察行为.出于这个原因,实现可以自由地消除独立"aesdf"对象并a以任何其他方式初始化阵列,从而产生预期的正确结果,即作为char a[] = { 'a', 'e', 's', 'd', 'f', '\0' }或作为char a[] = { 'a', 'e', "sdf" }其他东西.