【问题标题】:How to implement dup function for a variable in C如何在C中为变量实现dup函数
【发布时间】:2013-01-09 18:40:41
【问题描述】:

我有这个:

void duplication(int **tab1, int **tab2, int n, int m)

目标是将tab1复制到tab2中,所以我会得到相同的两个表。

我该怎么做,因为我知道使用 tab2 = tab1 在我的情况下不起作用:)

对不起,如果这是一个愚蠢的问题,我实际上正在学习 C!

谢谢。

【问题讨论】:

  • tab2 = tab1 是有效的 C,只是在这种情况下它可能不会做你想做的事。
  • 如果您只想更改tab2,最好将tab1 作为const 传递。
  • 如果可能,将目标设为第一个参数;赋值、初始化、memcpy()strcpy() 都将目标放在左边,源放在右边。这些int**s 究竟指向什么?现有数据是如何分配的? int** 是指向指针的指针;这本身并不能提供足够的信息。

标签: c pointers


【解决方案1】:

假设 n 和 m 是维度,并且您知道哪个维度适用于哪个维度,您需要一个类似这样的双循环:

for ( int x = 0; x < n; ++x )
{
    for ( int y = 0; y < m; ++y )
    {
        tab2[x][y] = tab1[x][y];
    }
}

鉴于您提供的函数的文档,这是我做出的几个重要假设,但希望代码能让您了解需要做什么,并且您可以在正确的位置替换正确的变量。

为了进一步参考,与此类数据复制相关的术语称为“深度复制”。在处理指针时,复制指针值通常是不够的,而且经常是不安全的。如果您想要更多关于此类代码的参考资料,请搜索“深拷贝”

【讨论】:

  • 假设tab2指向一个已经分配的指针数组,并且每个指针都指向一个已经分配的ints数组。
  • @KeithThompson 是的,就像我说的,关于函数及其参数的一些大假设
【解决方案2】:

您可以使用嵌套的 for 循环。通常复制任何变量,复制变量的内存分配应该在该函数内完成。复制函数应该如下所示。

int ** dup_tab(int **sr_table, int n, int m)
{
     int **dest_tabl = NULL;
     int i = 0;
     int j = 0;
     dest_tabl = malloc(sizeof(int *) * n);
     for (i = 0; i < n; i++)
     {
         dest_tabl[i] = malloc(sizeof(int) * m);
     }

     for (i = 0; i < n; i++)
     {
         for (j = 0; j < m; j++)
         {
             dest_tabl[i][j] = sr_table[i][j];
         }
     }
}

【讨论】:

    【解决方案3】:

    您应该建立一个具有底层内存“管理”的观点。

    可能您正在寻找类似的功能

    // defined in <string.h> and conform to C99
    
    void memcpy(void *dest, const void *src, size_t n); 
    

    n字节从src的开头复制到dest的开头。

    关于你的问题,如果你想使用这个功能,你必须知道*tab1指向的对象的大小Ntab[i]指向的每个对象M_i的大小(与i &lt; N)。如果你有这些信息,你可以根据

    解决你的问题

    C / C++ How to copy a multidimensional char array without nested loops?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2018-07-17
      • 2019-06-18
      • 1970-01-01
      • 2021-09-06
      • 2021-05-03
      相关资源
      最近更新 更多