【问题标题】:Creating Dynamic array as part of struct vs dynamic int array创建动态数组作为结构与动态 int 数组的一部分
【发布时间】:2021-06-27 23:15:52
【问题描述】:

我正在使用动态数组,请考虑两种情况 - 场景一:

typedef struct 
{
int *array;
int dataPtr;
} A;
static A dynaArray;
//Call the function as
dynaAdd(&dynaArray, <pointer to data block>, <length> );

static bool dynaAdd(A *data, int *dataCopy, int len)
{
    int newlen = (data->dataPtr + len); 
    data->array  = (int *) realloc(data->array, newlen * sizeof(int));
    if (!data->array)
    {
        return FALSE;
    }

    memcpy(&data->array[data->dataPtr], dataCopy,  len* sizeof(int));

   data->dataPtr += len; // update data ptr

 
    return TRUE;
}

我创建了一个static struct A data(比如说)并作为指针传递给一个函数,该指针每次都为A-&gt;array重新分配长度并向其中添加数据,维护一个dataPtr作为索引。这工作得很好,我可以创建一个长度为 100 的 A-> 数组,使用数据并释放指针和空值。

在另一个场景 2 -

static int *dynArray;
//Call the function as
dynaAdd(dynaArray, <pointer to data block>, <len>, <dataIdx> );
    
static bool dynaAdd(int *data, int *dataCopy, int len, int dataIdx)
{
    int newlen = (dataIdx + len); 
    data  = (int *) realloc(data, newlen * sizeof(int));
    if (!data)
    {
        return FALSE;
    }

    memcpy(&data[dataIdx], dataCopy,  len* sizeof(int));

   dataIdx += len ;

 
    return TRUE;
}

我只是使用int *array 而不是struct,维护一个static int dataPtr(say) 来跟踪下一个索引,将数组指针传递给函数并动态增长数组并向其中添加内容。但是,程序在创建一些 x 长度数组(不断变化)后崩溃。 有人可以帮助理解这两种方法之间的区别吗?在这两种情况下,目标都是创建一个动态数组并不断向其中添加内容,直到某个数据索引,然后释放该数组。 谢谢。

【问题讨论】:

  • 为了知道您可能做错了什么,我们需要查看您的代码。
  • 编辑问题以添加更多详细信息

标签: arrays c dynamic realloc


【解决方案1】:

在第二个示例中,您正在修改函数本地的data。这样的变化并没有反映在调用函数中,所以dynArray 没有变化。而且由于您重新分配了内存,如果内存移动了,那么这个指针现在是无效的,并且试图取消引用它会触发undefined behavior

您需要更改函数以接受int * 的地址,即int **,作为第一个参数并进行相应的更改。您还需要将dataIdx 设置为int *,这样对它的更改也会传播回来

所以你的函数现在看起来像这样:

static bool dynaAdd(int **data, int *dataCopy, int len, int *dataIdx)
{
    int newlen = (*dataIdx + len); 
    *data  = realloc(*data, newlen * sizeof(int));
    if (!*data)
    {
        return FALSE;
    }

    memcpy(&(*data)[*dataIdx], dataCopy,  len* sizeof(int));

    *dataIdx += len ;

 
    return TRUE;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2022-11-27
    • 2019-07-19
    • 2021-10-30
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多