加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么C变量在指针时不需要正确定义?

发布时间:2020-12-16 10:44:26 所属栏目:百科 来源:网络整理
导读:我是C语言的新手(特别是指针,经验主要是 PHP),并且会喜欢以下解释(我试过寻找答案). 两行代码如何在我的程序中完成相同的工作?第二行似乎违背了我所学到的一切.迄今为止对指针的理解. char disk [3] =“D:”; char * disk =“D:”; 我怎么能初始化指向内
我是C语言的新手(特别是指针,经验主要是 PHP),并且会喜欢以下解释(我试过寻找答案).

两行代码如何在我的程序中完成相同的工作?第二行似乎违背了我所学到的一切.迄今为止对指针的理解.

char disk [3] =“D:”;

char * disk =“D:”;

我怎么能初始化指向内存地址以外的任何指针?不仅如此,在第二行我也没有正确地声明阵列 – 但它仍在工作?

解决方法

在C和C中初始化数组的常用方法是:

int a[3] = { 0,1,2 };

Aside: And you can optionally leave out the array bound and have it deduced from the initializer list,or have a larger bound than there are initializers:

06001

对于字符数组,有一个特殊规则允许从字符串文字初始化数组,数组的每个元素都是从字符串文字中的相应字符初始化的.

您的第一个示例使用字符串文字“D:”,因此数组的每个元素都将初始化为该字符串中的字符,相当于:

char disk[3] = { 'D',':','' };

(第三个字符是null terminator,它隐含地存在于所有字符串文字中).

Aside: Here too you can optionally leave out the array bound and have it deduced from the string literal,or have a larger bound than the string length:

06003

Just like the aaa example above,the extra elements in ddd that don’t have a corresponding character in the string will be zero-initialized.

您的第二个示例有效,因为字符串文字“D:”将由编译器输出并存储在可执行文件中的某个位置,作为三个字符的数组.运行可执行文件时,包含该数组的段(以及其他常量)将映射到进程的地址空间.因此,您的char *指针随后被初始化为指向该数组的位置,无论发生在哪里.从概念上讲,它类似于:

const char __some_array_created_by_the_compiler[3] = "D:";
const char* disk = __some_array_created_by_the_compiler;

由于历史原因(主要是在C的早期不存在const),使用非const char *指向该数组是合法的,即使该数组实际上是只读的,所以C和第一个C标准允许您使用非const char *指针指向字符串文字,即使它引用的数组实际上是const:

const char __some_array_created_by_the_compiler[3] = "D:";
char* disk = (char*)__some_array_created_by_the_compiler;

这意味着尽管出现了两个例子并不完全相同,因为这只允许第一个:

disk[0] = 'C';

对于第一个没有问题的例子,它改变了数组的第一个元素.

对于第二个例子,它可能会编译,但它会产生undefined behaviour,因为它实际上正在做的是修改__some_array_created_by_the_compiler的第一个元素,它是只读的.在实践中,可能发生的是该过程将崩溃,因为尝试写入只读内存页面将引发分段错误.

重要的是要理解C中有很多东西(在C语言中甚至更多),编译器很乐意编译它们,但是当代码执行时会导致非常糟糕的事情发生.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读