【问题标题】:Difference between array of pointers and a 2-D array指针数组和二维数组之间的区别
【发布时间】:2018-10-01 02:34:00
【问题描述】:
int *m[10], n[10][10];
int a[] = {1,2,3,4,5,6,7,8,9,10};
m[4] = a;

以下哪项在尝试打印值时会出错,为什么? (假设即使 n[10][10] 被适当初始化)

1) m[2][4]
2) n[2]
3) m[3]

(PS:请详细说明)

【问题讨论】:

  • 您需要添加更多信息;您是要从这些索引中打印出值,为它们设置一些东西,还是什么?您是否正在创建 m 中的任何指针指向的任何其他内存?只是没有提供足够的信息。
  • 我正在尝试打印这些值。

标签: arrays pointers multidimensional-array


【解决方案1】:

当您尝试创建这些东西时,编译器不会抱怨,但您可能不会得到您期望的打印输出值。

int *m[10] 正在创建一个包含 10 个指向整数的指针的数组。这可能指向 10 个不同的整数,或者(我怀疑你在想)它可能指向 10 个整数“数组”。这里的问题是上下文(通常在 C 中);我们不确切知道您要做什么。 int* 指向包含int 的内存位置。这可能是单个int,也可能是ints 的数组。您的代码没有任何其他设置信息 - 没有 malloc'ing 或设置一个等于 int 地址的指针 - 所以我们不知道。当你打印出来时,我们不知道你会得到什么,因为内存似乎还没有被创建(根据我们在这里看到的代码)。

n[10][10] (在大多数系统上)将自动设置为初始化为 0 的 10x10 数组 - 但我们不能指望它。无论如何,我们不知道会打印出什么。如果您使用printf 打印出来,您可以打印 n[2] 保存的内存地址的值。可能不是你想要的。如果您不将其打印为指针,而是使用printf 的 %d 修饰符,编译器可能会显示警告但会允许。打印出来的地址将被解释为整数。可能也不是你想要的。

打印出 m[3] 与打印 n[2] 的问题相同,即打印 int 还是指针。但是,(可能)与 n m 的内存不同,(从您的代码中)永远不会被设置。它可能(在大多数系统上)打印出 0 因为它可能默认设置为空指针。不过再一次,我不知道我们是否可以指望这一点。

人们经常被告知,使用 C 语言可以有多种方式来做事——这是真的。但他们通常不被教导的是做大多数事情都有适当的背景,或者何时使用一种或另一种方法。很大程度上,上下文是由我们是使用编译时分配的内存还是运行时分配的内存来定义的。您需要阅读 C 中的内存管理并了解更多关于堆栈和堆的用途,然后才能真正了解它们之间的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2013-05-17
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多