2017-10-11 46 views
1

我尝试以下代码指向2D阵列与不相容的行长度

char arr[5] = {'A', 'E', 'I', 'O', 'U'}; 
    char (*p_arr)[1] = &arr; 
    printf("%c\n", p_arr[0][4]); //returns 'U' 

为什么没有任何错误,因为

char (*p_arr)[1] = &arr; 

似乎是从不兼容的类型的初始化(char (*)[5]而不是要求char (*)[1])?此外,p_arr[0][4]要求阵列的第5个元素应该只有1元素。这不是错的吗?

+0

你确定构建? 'p_arr'和'&arr'的类型是不同的,不应该允许初始化。 –

+2

至于我认为你的问题是,C没有边界检查。 –

+0

By _“C没有界限检查”_你的意思是说C编译器不在'char(* p_arr)[1] = &arr;'中使用'[1]'信息。如果是这样的话,C的静态内存分配是不是有问题? –

回答

0

你的编译器坏了/配置不正确/不合规。

数组指针指向具有1个元素的数组不兼容数组指针指向5个元素的数组。 简单的赋值的C语言中的规则说,一个有效的指针分配必须是(C11 6.5.16.1重点煤矿):

  • 左操作具有原子,合格,不合格的或指针类型,和(考虑两个操作数都是指向合格或不合格 兼容类型的指针,左边指向的类型具有 右边指向的所有类型的限定符;左边操作数在右边指向的所有类型的限定符都具有 。

如果我们删除所有来自引用文字的正式标准方面,我们结束了这个简单的英语:

=运算符的左操作数的指针类型,两个操作数都指向兼容类型的指针。

这是不是在你的代码的情况下,因此它含有一种被称为违反约束,意味着代码违反了什么是C标准允许的。

+0

对,我忘记了C编译器没有检查边界为'p_arr [0] [4]'部分。 –

+0

您是否尝试过执行'char(* p_arr)[1] = &arr;'部分代码?我在他们的网站上下载了codeblocks IDE,你确定我的编译器坏了/不符合? –

+0

@ Y.GP在我自己测试之后,编译器会发出关于赋值不兼容类型的*警告*。但是你必须记住C的键入很弱,这可能是它不是错误的原因。 –