【发布时间】: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