【问题标题】:How to iterate through and copy double pointer in C如何在C中遍历和复制双指针
【发布时间】:2019-03-22 09:34:45
【问题描述】:

我在 C 中创建了一个二维整数数组,用值对其进行了初始化,然后将其转换为 int**(我必须这样做,因为它是为了做作业)。
我设法遍历它并将所有值设置为 0。但是,当我再次遍历它并打印它的值时,输出不是 all 零。

这是一个最小的工作示例:

#include <string.h>
#include <stdio.h>

#define ROWS    3
#define COLS    2

int main(void)
{
    /* Create array and convert to double pointer */
    int c[ROWS][COLS] = {{1,2},{3,5},{8,13}};
    int **ptr = (int **)c;

    /* Loop through entire array and print then double each value. */
    int *temp[ROWS];
    for(int i = 0; i<ROWS; i++){
        temp[i] = (int*)(ptr+i);
        for(int j = 0; j<COLS; j++){
            printf("Before setting: %i\n", temp[i][j]);
            temp[i][j] = temp[i][j]*2;
        }
    }

    /* Copy temp back into ptr */
    memcpy(ptr, temp, sizeof(ptr));

    /* Loop through array and print values */
    int *temp2[ROWS];
    for(int i = 0; i<ROWS; i++){
        temp2[i] = (int*)(ptr+i);
        for(int j = 0; j<COLS; j++){
            printf("After setting: %i\n", temp2[i][j]);
        }
    }

}

问题是结果不是我所期望的。有一次我运行它,这是输出:

设置前:1
设置前:2
设置前:3
设置前:5
设置前:8
设置前:13
设置后:-1193330832
设置后:32764
设置后:6
设置后:10
设置后:16
设置后:26

程序每次运行时32764的值都是一样的,但是-1193330832的值每次都会变化(我假设是数组的内存地址)。

我期待的输出是:

设置前:1
设置前:2
设置前:3
设置前:5
设置前:8
设置前:13
设置后:1
设置后:4
设置后:6
设置后:10
设置后:16
设置后:26
因为第一个循环中的值已经翻了一番。

我做错了什么?为什么值会发生变化,我应该如何实际解决这个问题?

(P.S. 作业不涉及寻找迭代双指针的方法,但我需要能够完成实际任务)

【问题讨论】:

  • 你能更明确地说出你期待的结果吗?你期待Before sampling的结果相同吗?
  • 循环内的值加倍,所以我希望采样前为 2*。我会更新问题以反映这一点。

标签: c arrays pointers memory-address


【解决方案1】:

int **ptr = (int **)c; 不是有效的指针转换,因为您不能使用指针到指针来指向二维数组。因为它与二维数组无关。

相反,您可以使用指向二维数组的指针int (*)[ROWS][COLS];。然而,最方便的是使用指向一维数组的指针并让它指向二维数组的第一个元素:

int (*ptr)[COLS] = &c[0];

...

ptr[i][j] = ...;

固定示例:

#include <string.h>
#include <stdio.h>

#define ROWS    3
#define COLS    2

int main(void)
{
    /* Create array and convert to double pointer */
    int c[ROWS][COLS] = {{1,2},{3,5},{8,13}};
    int (*ptr)[COLS] = &c[0];

    /* Loop through entire array and print then double each value. */
    for(int i = 0; i<ROWS; i++){
        for(int j = 0; j<COLS; j++){
            printf("Before setting: %i\n", ptr[i][j]);
            ptr[i][j] = ptr[i][j]*2;
        }
    }

    /* Loop through array and print values */
    for(int i = 0; i<ROWS; i++){
        for(int j = 0; j<COLS; j++){
            printf("After setting: %i\n", ptr[i][j]);
        }
    }
}

(风格问题,但是你的 ROWS 和 COLS 的顺序有点奇怪,更常见的是 int[COLS][ROWS] 然后 for(i=0; i&lt;COLS; i++)

【讨论】:

  • @JolonB 但是您不能使用int** 指向二维数组。也许您的老师将它与如何动态分配指针对指针查找表混淆了。这些也不是二维数组。你的老师可能不太懂 C...
  • @JolonB 简单地说,试试这个:int **ptr = c;。编译器说“我不能这样做,因为它不是有效的指针转换”。然后,当您将其更改为 int **ptr = (int **)c; 时,您会告诉编译器“闭嘴,我知道我在做什么”。除了在这种情况下不是真的,因为指向的数据不是指针,也不是指针数组。
  • @Lundin 我不是他/她的老师,但你不应该评判你甚至不认识的人。可能是乔隆没看懂作业。或者即使他这样做了,你的评论也没有意义
  • @JolonB 是的,那是废话,你的老师无能。正确的函数应该是 void show_array (int array[ROWS][COLS]) { for(int i = 0; i&lt;ROWS; i++){ for(int j = 0; j&lt;COLS; j++){ printf("%d ", array[i][j]); } printf("\n"); } } 任何地方都没有强制转换,否则你做错了。
  • @FrancescoBoi 我只是在判断发布的代码。任何专业的 C 程序员都会认为这是无稽之谈和未定义的行为。不过,当不称职的庸医教授 C 编程时,我确实感到不安。意味着有人必须对他们被骗的穷学生进行重新教育。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多