为什么在C中分配矩阵时会得到十六进制值?

为什么在C中分配矩阵时会得到十六进制值?,c,matrix,malloc,C,Matrix,Malloc,我想使用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=

我想使用
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]);
}

您正在访问矩阵的第160行和第160列,但在本例中,索引的范围是0到159

在尝试访问矩阵之前,请尝试重置
i
j
变量

编辑:

如果要查看分配的值,可能需要执行以下操作:

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

此外,您应该将
malloc.h
include更改为
stdlib.h
,最新版本是标准版本。

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

在尝试访问矩阵之前,请尝试重置
i
j
变量

编辑:

如果要查看分配的值,可能需要执行以下操作:

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

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

C
中,数组索引从
0
开始。因此,当您在
R[160][160]处访问元素时,2D数组
R
的范围从
0
159
不等,导致未定义的行为

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


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

C
中,数组索引从
0
开始。因此,当您在
R[160][160]处访问元素时,2D数组
R
的范围从
0
159
不等,导致未定义的行为

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


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

R[160][160]
超出范围。索引是[0,size.
是非标准的;函数
malloc()
(以及它的朋友)在
中声明。0x13d=317=158+159为什么要对
行和
cols
这样的常量使用变量?
R[160][code>超出范围。索引是[0,大小)。
是非标准的;函数
malloc()
(以及它的朋友)是在
.0x13d=317=158+159中声明的。为什么要对
等常量使用变量?是的,谢谢!但是当我打印完整的矩阵时,我得到一种十六进制值?但是我可以把&?@Strömungsmachanik放在哪里呢?这是因为您使用了
%p
格式说明符。如果您想看到您可以删除
void*
cast并将格式说明符更改为
%d
。这就是@Mauren感谢您的有力回答。实际上,我想使用动态分配来获得一个巨大的索引!当我使用静态分配时,我得到了分段错误核心转储。非常感谢您的帮助:)是的谢谢!但是当我打印完整的矩阵时,我得到了一种十六进制的值?但是我可以把&?@Strömungsmechanik放在哪里呢?这是因为你使用的是
%p
格式说明符。如果你想看到你写的值,你可以删除你的
void*
强制转换并将格式说明符改为
%d
。那就是@Mauren谢谢你的帮助有力的回答。事实上,我想使用动态分配来获得一个巨大的索引!当我使用静态分配时,我的分割错误核心被丢弃。非常感谢您的帮助:)a