gpt4 book ai didi

c - 全局定义和全局变量声明的区别

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:11 24 4
gpt4 key购买 nike

我试图理解在数组声明中混合使用指针和数组。全局变量声明和定义指令的用法让我有点困惑。代码片段如下所示。

#include <stdio.h>

const int ts1[2] = {(1), (2)};
const int ts2[2] = {(2), (3)};
const int ts3[2] = {(3), (4)};
const int ts4[2] = {(4), (5)};
#define tc1 {1,2}
#define tc2 {2,3}
#define tc3 {3,4}
#define tc4 {4,5}

int main()
{
const int arr1[][2][2] = {{{(1), (2)}, {(2), (3)}}, {{(3), (4)}, {(4), (5)}}};
const int *arr2[2][2] = {{ts1, ts2}, {ts3, ts4}};
const int arr3[][2][2] = {{tc1, tc2}, {tc3, tc4}};
const int *arr4[2][2] = {{tc1, tc2}, {tc3, tc4}};

printf("%d\n", arr2[1][1][1]);
printf("%d\n", arr3[1][0][1]);
printf("%d\n", arr4[1][0][1]);
return 0;
}

arr1 是声明数组的常规方式。arr2 w/global var decl 和 arr3 w/define 指令也可以正常工作。但是,带有 define 指令的 arr4 在运行时向我发出了段错误。考虑到 define 指令只需将它定义的任何内容替换到 arr4 的初始化列表中,为什么 arr2 可以工作而 arr4 不能?

最佳答案

当应用宏替换时,这:

const int *arr4[2][2] = {{tc1, tc2}, {tc3, tc4}};

变成:

const int *arr4[2][2] = {{{1,2}, {2,3}}, {{3,4}, {4,5}}};

arr4int * 的二维数组,但是您将类似 {1,2} 的内容分配给每个不是整数 *。如果您使用复合文字,这可以工作:

const int *arr4[2][2] = {{(int [])tc1, (int [])tc2}, {(int [])tc3, (int [])tc4}};

变成:

const int *arr4[2][2] = {{(int []){1,2}, (int []){2,3}}, {(int []){3,4}, (int []){4,5}}};

然后您将一个实际的数组分配给 arr4 的每个元素,该数组衰减为指向其第一个元素的指针。

这个有效:

const int *arr2[2][2] = {{ts1, ts2}, {ts3, ts4}};

因为ts1ts2ts3ts4int类型的数组code>,因此在这里使用它们会导致它们衰减到指向其第一个元素的指针。

关于c - 全局定义和全局变量声明的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53527066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com