如何在C

时间:2019-03-22 09:34:45

标签: c arrays pointers memory-address

我已经在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。的功课不涉及寻找遍历双指针的方法,但我需要能够完成实际任务)

1 个答案:

答案 0 :(得分:2)

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

您可以使用指向2D数组int (*)[ROWS][COLS];的指针。但是,最方便的方法是使用指向1D数组的指针并将其指向2D数组的第一个元素:

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++)更为常见)