【问题标题】:Why do I get hexadecimal values when I allocate a matrix in C?为什么在 C 中分配矩阵时会得到十六进制值?
【发布时间】:2014-03-13 11:58:13
【问题描述】:

我想使用malloc 在 C 中分配一个矩阵。编译成功结束,但执行程序时得到一个奇怪的值。请在这里举个例子:

#include<stdio.h>
#include<malloc.h>

int main(int argc, char **argv){
int rows=160, cols=160;
int *mat = (int *)malloc(rows * cols * sizeof(int));
int i, j;

for(i=0;i<160;i++) for(j=0;j<160;j++) mat[i * cols + j]=i+j;

for(i=0;i<160;i++) for(j=0;j<160;j++)
printf("R[%d][%d] = %p\n", i, j, (void*)mat[i * cols + j]);
}

我在执行后得到例如:

R[158][159] = 0x13d

【问题讨论】:

  • R[160][160] 超出范围。索引为 [0, size)。
  • &lt;malloc.h&gt; 是非标准的;函数malloc()(及其朋友)在&lt;stdlib.h&gt;中声明。
  • 0x13d = 317 = 158 + 159
  • 为什么要使用变量来表示rowscols 这样的常量?

标签: c matrix malloc


【解决方案1】:

您正在访问矩阵的第 160 行和第 160 列,但在您的情况下,索引范围为 0 到 159。

在尝试访问您的矩阵之前尝试重置您的 ij 变量。

编辑:

如果您想查看分配的价值,您可能需要这样做:

printf("R[%d][%d] = %d\n", i, j, mat[i * cols + j]);

另外,您应该将您的 malloc.h 包含更改为 stdlib.h,最新的是标准的。

【讨论】:

  • 好的,谢谢!但是当我打印完整的矩阵时,我得到了一种十六进制值?但是我可以把 & 放在哪里?
  • @Strömungsmechanik 这是因为您使用的是 %p 格式说明符。如果你想查看你写的值,你可以删除你的void*演员并将格式说明符更改为%d
  • 那是@Mauren,感谢您的有力回答。实际上我想使用动态分配以获得巨大的索引!当我使用静态的时,我得到了分段错误核心转储。非常感谢您的帮助:) a
【解决方案2】:

C 中,数组索引从0 开始。因此,您的二维数组 R 的范围从 0159 导致当您访问 R[160][160] 的元素时出现未定义的行为

格式说明符%p 在 printf 中用于打印内存位置的地址。这些内存位置中的值使用%d

另外你还没有free() 使用malloc() 分配的内存,使你的程序leak 内存。

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2014-11-30
    • 2011-06-01
    • 2011-12-09
    • 2018-07-26
    • 2015-02-14
    相关资源
    最近更新 更多