【问题标题】:It is simplified version of my code. I have a problem with output. How can I fix it?这是我的代码的简化版本。我的输出有问题。我该如何解决?
【发布时间】:2020-08-23 10:06:35
【问题描述】:
int* row;
row = (int*)(malloc)(5 * sizeof(int));
int **s1;
s1=(int**)(malloc)(2*sizeof(row)); 

row[0] = 1;
row[1] = 2;
row[2] = 1;
row[3] = 2;
row[4] = 1;
s1[0] = row;

row[0] = 3;
row[1] = 3;
row[2] = 3;
row[3] = 4;
row[4] = 3;
s1[1] = row;

for (int i = 0; i < 5; i++) printf("%d", s1[0][i]);
printf("\n");
for (int i = 0; i < 5; i++) printf("%d", s1[1][i]);

我的输出:

33343

33343

但我想看看

12121

33343

作为输出。另外,我不想使用静态分配。

【问题讨论】:

  • s1[0] = row 是对row 的引用。然后操作行的内容并将第二个引用分配给s1[1]s1[0]s1[1] 都指向同一个东西 (row)。
  • 顺便说一句:不要在 C 中强制转换 malloc() !!! :-)
  • 换一种说法(已经指出)...s1[0]s1[1] 指向内存中相同的数字数组,地址为row。所以s1[0]s1[1] 总是指向同一个数字列表。如果您希望您的代码按预期工作,例如,您需要将row1row2 分开。您可以动态分配它们。

标签: c pointers memory dynamic


【解决方案1】:

动态分配的指针数组的两个指针(元素)在赋值后都指向同一个对象行

s1[0] = row;
//...
s1[1] = row;

那么指针row所指向的数组中当前时刻存储的就是s1[0]和s1[1]这两个指针。

您需要将指针 s1[1] 设置为其他数组。

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2020-02-14
    相关资源
    最近更新 更多