c - 如何在C中迭代和复制双指针

标签 c arrays pointers memory-address

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

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

#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]);
        }
    }

}

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

Before setting: 1
Before setting: 2
Before setting: 3
Before setting: 5
Before setting: 8
Before setting: 13
After setting: -1193330832
After setting: 32764
After setting: 6
After setting: 10
After setting: 16
After setting: 26

每次程序运行时,值32764都是相同的,但值-1193330832每次都会改变(我假设它是数组的内存地址) .

我期望的输出是:

Before setting: 1
Before setting: 2
Before setting: 3
Before setting: 5
Before setting: 8
Before setting: 13
After setting: 1
After setting: 4
After setting: 6
After setting: 10
After setting: 16
After setting: 26
because the values in the first loop have been doubled.

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

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

最佳答案

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<COLS; i++) )

关于c - 如何在C中迭代和复制双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55296636/

相关文章:

c - 如何打印一个巨大的字符串

c - 使用 MinGW 的 GCC 内联汇编加载 IDT 结构失败

具有递归回溯返回错误的c数独求解器

javascript - 在 Jasmine 中,array.includes 不起作用(必须用其他函数代替)。为什么?

c - 从 C 中的用户定义函数返回指针

c - 无符号位域类型 : int or unsigned int

java - 4 键值HashMap?大批?最好的方法?

c++ - 不可能的 C++ 数组索引

c - 为什么这个链表初始化不起作用?

c - 为什么下面两个代码提供不同的结果?