c - 如何将指向结构数组的指针传递给函数

标签 c pointers struct deep-copy

指针总能让我进入 C 编程。

我遇到了麻烦,我想将一个指向结构数组的指针传递给一个函数,这样它就可以修改结构,然后传递数组的成员,以便稍后在其他函数中使用。问题是当我认为我索引数组并将其指向修改后的结构时,我稍后尝试查看成员,它们不是修改后的值。这是我的一些代码

typedef struct
{
  int rows;
  int columns;
  int *data;
} Mat;

int main(void)
{
  Mat result, decoded_result;
  int result_data[8] =
  { 0, 0, 0, 0, 0, 0, 0, 0 };
  int decoded_data[4] =
  { 0, 0, 0, 0 };
  result.columns = 1;
  result.rows = 8;
  result.data = &result_data[0];
  decoded_result.columns = 1;
  decoded_result.rows = 4;
  decoded_result.data = &decoded_data[0];

  Mat m1, m2, m3, m4, m5;
  m1.rows = m2.rows = m3.rows = m4.rows = m5.rows = 4;
  m1.columns = m2.columns = m3.columns = m4.columns = m5.columns = 1;

  int md1[4], md2[4], md3[4], md4[4], md5[4];

  m1.data = &md1[0], m2.data = &md2[0], m3.data = &md3[0], m4.data = &md4[0], m5.data =
      &md5[0];

  Mat mat_array[10] =
  { m1, m2, m3, m4, m5 };

  decode_data(&result, &decoded_result, mat_array);
  return 0;
}

int decode_data(Mat *result, Mat *decoded_result, Mat *mat_array)
{
  int ii;
  int size_of_EEPROM = 5;
  //steps to decode data
  for (ii = 0; ii < size_of_EEPROM; ii++)
  {
    decode(result, decoded_result); //decodes hamming 8,4, works
    mat_array[ii] = *decoded_result; ///This is where the problem is
  }
  return 0;
}

在此先感谢您的指点帮助:)

最佳答案

由于 Mat 带有一个指针,简单地将 Mat a 分配给 Mat b 是行不通的。至少对于 Mat 的成员 data 引用的数据而言不是。

这里需要做的也称为Deep Copy。深度复制还会创建 data 所引用内容的副本。

下面是如何为 Mat 完成此操作的示例。

注意:由于负数行和列没有用,您最好像这样声明 Mat:

typedef struct
{
  size_t rows;
  size_t columns;
  int * data;
} Mat;

(由于 size_t 被定义为 unsigned 这种声明使得不必测试成员 rowscolumns 在 deep-coping 时分配新数据之前,如下所示)

#include <stdlib.h> /* for malloc(), size_t */
#include <string.h> /* for memcpy() */
#include <errno.h> /* for errno, ENOMEM, EINVAL */

...

/* Deep-copies src to dst. */
/* Returns 0 on success or -1 on error. Sets errno in the latter case. */
int mat_copy(Mat * dst, const Mat * src)
{
  if ((!dst) || (!src))
  {
    errno = EINVAL;
    return -1;
  }

  dst->rows = src->row;
  dst->columns = src->columns
  dst->data = NULL;

  if (src->data)
  {
    size_t size = dst->rows * dst->columns * sizeof (*(dst->data));

    dst->data = malloc(size);
    if (!dst->data)
    {
      errno = ENOMEM;
      return -1;
    }

    memcpy(dst->data, src->data, size);
  }

  return 0;
}

关于c - 如何将指向结构数组的指针传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17343665/

相关文章:

c - 调用 pthread_join() 后出现段错误

c - 浮点加法无法正常工作

c++ - 如何让 MSVC 将未初始化的数据放入 .bss?

c - 为什么这个程序在返回指向局部静态变量的指针时会出现段错误?

c - 错误前的预期表达

c - 识别传递关系

C 中的 char 指针和 strcpy

c++ - C++ 中的指针/多维数组

arrays - 如何通过引用将结构数组作为接口(interface)传递

swift - RxSwift 从一个 Observable 更新多个变量