为什么在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