我只是不明白在下面的程序中的错误。我做了什么是我已经分配了一个大小为5的数组地址到指针ptr类型(*)[]
。没有类型不匹配,它可以作为尽管如此。但是我想打印值ptr + 1。正如我所料,它显示了一个关于未指定边界的错误。但它只是想我如何将相同的ptr+1
工作正常,当我把它投入void*
。对于(* ptr)[],为什么printf(“%p”,(void *)ptr + 1)有效但不是printf(“%p”,ptr + 1)?
铸造是好的,但在它之前,该程序如何计算ptr+1
,因为它根本不知道边界?如何知道是否要提前5个元素,或者前面8个元素或前面的任何元素?为什么(void*)ptr+1
显示与ptr+1
相同的错误?
为了更好地突出整个事情,我还使用了一个指针ctr
,它被明确声明为(*)[5]
而不是(*)[]
。请给我背后的技术原因。谢谢。
#include<stdio.h>
int main(void)
{
int ar1[5]={1,5,3,8,9};
int (*ptr)[]=&ar1,(*ctr)[5]=&ar1;
printf("%p\n",ptr+1); //ERROR about unspecified bounds
printf("%p\n",(void*)ptr+1); //It's ok
printf("%p\n",ctr+1); //It's ok
}
PSST !!最后两个正确printf()
s不会产生相同的值。如果我注释掉不正确的printf("%p\n",ptr+1);
行,则这是输出。
0023FF25
0023FF38
PSST!!
我检查一遍,INT的(void*)ptr+1
的ptr+1
部分,一个1
只是简单地添加到ptr
数值。什么事?
@KingsIndian MinGW的 – Thokchom 2013-05-02 11:22:20