注册 登录
编程论坛 C语言论坛

以下两段代码输出结果为何不同?

hffjhhh 发布于 2020-04-28 22:05, 2201 次点击
第一份代码如下:
程序代码:
#include"stdio.h"
int main(void){
    int *ptr;
    int torf[2][2]={12,14,16};
    ptr=torf[0];
    printf("%d  %d",*ptr,*(ptr+2));
    return 0;
}

输出结果为:12 16
第二份代码如下:
程序代码:
#include"stdio.h"
int main(void){
    int *ptr;
    int torf[2][2]={{12},{14,16}};
    ptr=torf[0];
    printf("%d  %d",*ptr,*(ptr+2));
    return 0;
}

输出结果为:12 14

为什么第二份代码的初始化的内容中多了两个花括号,就导致两份代码的输出结果不同?
6 回复
#2
thhkb2020-04-28 22:30
只有本站会员才能查看附件,请 登录
#3
thhkb2020-04-28 22:31
第二个程序的{{12},{14,16}},第一行默认是12,0
#4
hffjhhh2020-04-28 23:16
回复 3楼 thhkb
还有另一个问题,以下两份代码中,为什么第一份代码可以运行,第二份代码却无法运行?
第一份代码如下:
程序代码:

#include"stdio.h"
int main(void){
    int (*ptr)[2];
    int torf[2][2]={12,14,16};
    ptr=torf;
    printf("%d  %d",**ptr,**(ptr+1));
    return 0;
}

第二份代码如下:
程序代码:
#include"stdio.h"
int main(void){
    int *ptr;
    int torf[2][2]={12,14,16};
    ptr=torf;
    printf("%d  %d",**ptr,**(ptr+1));
    return 0;
}
#5
aec15302020-04-28 23:32
回复 4楼 hffjhhh
类型不一样,第一个是数组指针

[此贴子已经被作者于2020-4-28 23:35编辑过]

#6
thhkb2020-04-29 08:38
回复 4楼 hffjhhh
第二个程序,ptr=torf,只是把torf数组中的值传了过去,而ptr只是个指针变量,**(ptr+1)这个语句的意思就相当是地址+1取值,然后ptr这个指针变量就会溢出。而第一个程序的ptr设置的是数组指针,所以你+1不会溢出。
#7
hffjhhh2020-04-29 16:07
以下是引用thhkb在2020-4-29 08:38:27的发言:

第二个程序,ptr=torf,只是把torf数组中的值传了过去,而ptr只是个指针变量,**(ptr+1)这个语句的意思就相当是地址+1取值,然后ptr这个指针变量就会溢出。而第一个程序的ptr设置的是数组指针,所以你+1不会溢出。

这似乎不是溢出的问题,因为如果将代码改为这样,此时ptr没有溢出,但是同样不行.
程序代码:
#include"stdio.h"
int main(void){
    int *ptr;
    int torf[2][2]={12,14,16};
    ptr=torf;
    printf("%d  ",**ptr);
    return 0;
}
1