【问题标题】:Using malloc for a dynamic array in C在 C 中将 malloc 用于动态数组
【发布时间】:2020-08-17 04:08:55
【问题描述】:

我有以下这段代码。

当我在第一次迭代后迭代 *attachmentsArray 时,我遇到了段错误,即使 size==3 也是如此。 我在这里做错了什么?

void secondary(char** array, long size)
{

   *array = (char*)malloc(size*sizeof(char));
   for(int i = 0; i < size; i++)
   {
       *array[i] = '.';
   }
}
void main()
{
    char* attachmentsArray;
    long size = 3;
    secondary(&attachmentsArry, size);
}

【问题讨论】:

  • secondary()的第一个参数的名字应该是attachmentsArray吗?这似乎是函数体中使用的名称。
  • size==10 是什么意思?请发帖Minimal, Reproducible Example
  • @JohnBollinger 对不起,错字。
  • @MikeCAT 已修复,抱歉

标签: c segmentation-fault malloc


【解决方案1】:

索引运算符 ([]) 的优先级高于取消引用运算符 (一元 *)。实际上,最高的运算符优先级层由所有后缀运算符组成。因此,

   *array[i] = '.'

等价于

   *(array[i]) = '.'

。这是有效的,因为表达式array[i] 具有类型char *,并且在这个意义上是一元* 的有效操作数,但对于非零的iarray[i] 不指定有效指针,并且尝试取消引用它会导致段错误也就不足为奇了。

相反,你想要

   (*array)[i] = '.'

【讨论】:

    【解决方案2】:

    您的问题在于 *[] 运算符的相对优先级。您的线路:

        *array[i] = '.';
    

    正在取消引用(或尝试)指针数组中的“第 i 个”元素。

    您需要的是,访问array 指向的数组的“第 i 个”元素指向是这样的:

        (*array)[i] = '.';
    

    请随时要求进一步澄清和/或解释。

    【讨论】:

    • 太棒了!我在哪里可以了解运算符的相对优先级?
    • @willywill997 Here!
    【解决方案3】:

    分段错误是由于 *array[i]="."因为什么 malloc 只返回一个指向分配的内存的起始地址的指针,你不能通过索引直接迭代..

    其他答案也是正确的,但您也可以通过增加指针来指向相应的地址块,例如 *array = "."; *数组++;

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      相关资源
      最近更新 更多