【问题标题】:Multidimensional array with unequal second dimension size using malloc()使用 malloc() 具有不相等第二维大小的多维数组
【发布时间】:2010-03-08 00:14:32
【问题描述】:

我正在玩不等第二维大小的多维数组。 假设我需要以下数据结构:

[&ptr0]->[0][1][2][3][4][5][6][7][8][9]

[&ptr1]->[0][1][2]

[&ptr2]->[0][1][2][3][4]

int main()
{
 int *a[3];
 int *b;
 int i;

 a[0] = (int *)malloc(10 * sizeof(int));
 a[1] = (int *)malloc(2 * sizeof(int));
 a[2] = (int *)malloc(4 * sizeof(int));

 for(i=0; i<10; i++) a[0][i]=i;

 for(i=0; i<2; i++) a[1][i]=i;

 for(i=0; i<4; i++) a[2][i]=i;
}

我做了一些测试,似乎我可以在 a[1][3] 中存储一个值。这是否意味着我的数组中的行大小相同 10?

【问题讨论】:

    标签: c multidimensional-array malloc


    【解决方案1】:

    不,地址 a[1][3] 并不“正式存在”。它是一个未在您的程序中定义的内存,访问它会导致未定义的行为。

    可能会导致以下错误:

    • 分段错误(访问 内存受限)
    • 使用了已被其他变量(其他分配内存)使用的内存(因此可能覆盖)
    • 可以是未初始化的值(未使用的内存地址)

    【讨论】:

    • 好的,所以在大运行中我可能会遇到运行时错误。谢谢,这正是我不确定的。
    • 指针不是一件容易的事,当你开始的时候。我推荐你使用 Valgrind。它是一个可以检测内存泄漏和你在这篇文章中提到的问题的工具。
    【解决方案2】:

    这是您代码的未定义行为。您正在访问您不拥有的东西。它可能有效,也可能无效,但总是错误的。

    【讨论】:

      【解决方案3】:

      没有


      您的程序中有大量内存用于 I/O 缓冲区、库数据结构、malloc 系统本身、命令行参数和环境等。(其中一些在堆栈上。)

      是的,你可以破坏超出范围的东西。

      请记住,x[i]*(x + i) 相同。因此,很容易计算您引用的地址。它可能覆盖您的一个数据结构,它可能覆盖您的数据结构的一部分,它是 malloc 机制中的私有字段,或者它可能覆盖库数据。

      【讨论】:

      • 谢谢,现在我明白了如何计算访问内存位置的确切地址
      • "(x + i)" 准确来说应该是 *(x + isizeof(x 指向的类型))
      • 是的,这就是它的实现方式,但我的意思是字面意思,即:在 C 语言中,x[i] 可以完全替换为 *(x + i)。类型大小的乘法由编译器提供。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2011-10-30
      • 2021-12-05
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多