【问题标题】:Initializing array (pointer) with values [duplicate]用值初始化数组(指针)[重复]
【发布时间】:2018-08-09 00:20:13
【问题描述】:

因此,在 C 语言中,这完全有效:

int myArray[] = {1, 2, 3};

为什么在访问元素时出现以下运行时错误?

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

myArray2[0] 基本上表示*myArray2 时,这也不行吗?

【问题讨论】:

  • int * myArray2 = {1, 2, 3}; 是一个错误;如果您没有看到错误消息,请调整您的编译器设置。鉴于代码首先应该是编译错误,因此运行时行为毫无意义
  • 所以 {1, ...} 只有在将变量显式声明为数组时才有可能?
  • 数组和结构可以有多个初始化器(每个元素一个),指针唯一可能的初始化器是内存位置的地址(或空)
  • 指针不是数组,数组也不是指针。

标签: c arrays pointers exception


【解决方案1】:

我认为根本区别在于声明数组隐式分配内存,而声明指针则不。

int myArray[3]; 声明一个数组并为 3 个int 值分配足够的内存。

int myArray[] = {1,2,3}; 是一个小语法糖,它让数组的大小由初始化值决定。就内存分配而言,最终结果与前面的示例相同。

int *myArray; 声明一个指向 int 值的指针。它不为int 值的存储分配任何内存。

int *myArray = {1,2,3}; 据我所知不支持语法。我希望你会得到一个编译器错误。 (但我已经很多年没有做过实际的 C 编码了。)即使编译器允许它通过,赋值也会失败,因为没有分配内存来存储值。

虽然您可以使用数组语法来引用指针变量,但这仅在您已分配内存并将其地址分配给指针时才有效。

【讨论】:

    【解决方案2】:

    指针和数组是不同的。它们之间的一个区别是您的问题的主题。当你定义一个指定大小的数组时,你就有足够的内存来初始化它。

    但是,在指针中,你应该分配内存来初始化它。因此,您应该首先使用malloc 之类的函数分配内存,并将指针指向已分配的内存。因此,第二个代码的问题是您想要访问未分配的内存部分。 你可以像下面这样更正它:

    int *myarray2 = malloc(3*sizeof(int));
    myarray2[0] = 1;
    myarray2[1] = 2;
    myarray2[2] = 3;
    

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多