我已经创建了一小段代码来动态地在C中分配一个2D数组,这用于尝试解决我在更大的代码上遇到的问题,如果我可以动态分配一个2D阵列我相信我会解决我的另一个问题。我遇到的问题是,在我分配了矩阵并用函数写入它后,我的程序没有运行,我没有得到任何错误,它只是创建一个空白屏幕并最终崩溃。我不确定从哪里开始,任何帮助都会非常感激!
以下是代码:
#include <stdlib.h>
void get_matrix(double **a, int n);
int main() {
int n = 5;
int i, j;
double **a;
a = (double **)malloc(n * sizeof(double *));
for (j = 0; j < n; j++)
a[j] = (double *)malloc(n * sizeof(double));
get_matrix(a, n);
for (i = 0; i <= n; i++) {
for (j = 0; j <= n; j++) {
printf("%d, ", a[i][j]);
}
printf("\n, ");
}
return 0;
}
void get_matrix(double **a, int n) {
int i, j;
for (i = 0; i <= n; i++) {
for (j = 0; j <= n; j++) {
a[i][j] = 4;
}
}
}
答案 0 :(得分:2)
问题在于for循环。您的for循环现在运行n + 1
次,而不是n
次。这意味着您正试图在未分配的内存区域上写一些内容。
for (i=0; i<=n; i++)
应该是:
for (i=0; i<n; i++)
你必须使用条件少而不是小于或等于。
虽然我可以看到你的代码,但我还是会建议一些技巧,以便通过直接在sizeof中使用变量来避免以后的问题:
a = (double **) malloc (n * sizeof(*a));
这将自动检测分配大小所需的sizeof
*a
。
答案 1 :(得分:2)
您的代码中存在多个问题:
<stdio.h>
i
和j
运行一步太远:因为基于C的索引为零,您必须在n
之前停止,否则您将尝试访问数组外的元素。此错误会导致未定义的行为,这是您观察到的合理解释。double
%d
转换规范传递printf
。请改用%g
。以下是改进版本:
#include <stdio.h>
#include <stdlib.h>
static void get_matrix(int n, double a[n][n]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = 4;
}
}
}
int main(void) {
int n = 5;
double (*a)[n] = malloc(sizeof(*a) * n);
get_matrix(n, a);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%g, ", a[i][j]);
}
printf("\n");
}
return 0;
}
答案 2 :(得分:1)
您的索引基于零。这意味着你用&lt;来检查for循环的结束条件。而不是&lt; =。 0..n-1是您分配的n个位置。
#include <stdlib.h>
void get_matrix (double **a, int n);
int main ()
{
int n = 5;
int i, j;
double **a;
a = (double **) malloc (n * sizeof(double *));
for (j = 0; j < n; j++)
a[j] = (double *) malloc (n * sizeof(double));
get_matrix (a, n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%d, ", a[i][j]);
}
printf("\n, ");
}
return 0;
}
void get_matrix (double **a, int n)
{
int i, j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
a[i][j] = 4;
}
}
}
答案 3 :(得分:0)
自上周你上次帮助我以来,我一直无法解决这个问题!我对它的编写方式进行了一些修改并运行良好,唯一的问题是当我打印矩阵时它只打印零?
我已将修改后的代码包含在内。
#include <stdio.h>
#include <stdlib.h>
void get_matrix (double **a, int n);
void print_matrix (double **a, int n);
int main ()
{
int n = 5;
int i, j;
double **a;
a = (double **) malloc (n * sizeof(double *));
for (j = 0; j < n; j++)
a[j] = (double *) malloc (n * sizeof(*a));
get_matrix (a, n);
print_matrix (a, n);
return 0;
}
void get_matrix (double **a, int n)
{
int i, j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
a[i][j] = 4;
}
}
}
void print_matrix (double **a, int n)
{
int i, j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%d, ", a[i][j]);
}
printf("\n ");
}
}