动态分配的二维数组出错
Error with a dynamically allocated 2D array
我已经创建了一小段代码来在 C 中动态分配一个二维数组,如果我可以动态地思考,这将被用来尝试解决我在一段较大的代码中遇到的问题分配一个二维数组我相信我会解决我的其他问题。我遇到的问题是,在我分配矩阵并使用我的程序没有的函数写入它后 运行,我没有收到任何错误,它只是创建一个空白屏幕并最终崩溃。我不确定从这里可以取得怎样的进展,如有任何帮助,我们将不胜感激!
代码如下:
#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;
}
}
}
问题出在 for 循环中。您的 for 循环现在运行 n + 1
次而不是 n
次。这意味着您正试图在未分配的内存区域的某处写入。
for (i=0; i<=n; i++)
应该是:
for (i=0; i<n; i++)
您必须使用条件 小于 而不是 小于或等于 .
虽然我可以看到你的代码,但我也会建议一些技巧,通过直接在 sizeof 中使用变量来避免以后出现问题:
a = (double **) malloc (n * sizeof(*a));
这将自动检测分配大小所需的 *a
中的 sizeof
。
您的索引是从零开始的。这意味着您使用 < 而不是 <= 检查 for 循环的结束条件。 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;
}
}
}
您的代码中存在多个问题:
- 你不包括
<stdio.h>
- 你的循环索引
i
和 j
运行 一步太远了:因为索引在 C 中是基于零的,你必须在 n
之前停止,否则你会尝试并访问数组外的元素。此错误会导致未定义的行为,这是对您观察到的情况的合理解释。
- 您为
%d
printf
转换规范传递了 double
。请改用 %g
。
- 您在行首打印了额外的逗号。
- 你的数组并不是真正的二维数组,它是一个间接数组。在 C99 中,您可以分配和使用具有参数大小的动态数组,称为 VLA。看下面的语法:
这是一个改进版本:
#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;
}
我已经创建了一小段代码来在 C 中动态分配一个二维数组,如果我可以动态地思考,这将被用来尝试解决我在一段较大的代码中遇到的问题分配一个二维数组我相信我会解决我的其他问题。我遇到的问题是,在我分配矩阵并使用我的程序没有的函数写入它后 运行,我没有收到任何错误,它只是创建一个空白屏幕并最终崩溃。我不确定从这里可以取得怎样的进展,如有任何帮助,我们将不胜感激!
代码如下:
#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;
}
}
}
问题出在 for 循环中。您的 for 循环现在运行 n + 1
次而不是 n
次。这意味着您正试图在未分配的内存区域的某处写入。
for (i=0; i<=n; i++)
应该是:
for (i=0; i<n; i++)
您必须使用条件 小于 而不是 小于或等于 .
虽然我可以看到你的代码,但我也会建议一些技巧,通过直接在 sizeof 中使用变量来避免以后出现问题:
a = (double **) malloc (n * sizeof(*a));
这将自动检测分配大小所需的 *a
中的 sizeof
。
您的索引是从零开始的。这意味着您使用 < 而不是 <= 检查 for 循环的结束条件。 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;
}
}
}
您的代码中存在多个问题:
- 你不包括
<stdio.h>
- 你的循环索引
i
和j
运行 一步太远了:因为索引在 C 中是基于零的,你必须在n
之前停止,否则你会尝试并访问数组外的元素。此错误会导致未定义的行为,这是对您观察到的情况的合理解释。 - 您为
%d
printf
转换规范传递了double
。请改用%g
。 - 您在行首打印了额外的逗号。
- 你的数组并不是真正的二维数组,它是一个间接数组。在 C99 中,您可以分配和使用具有参数大小的动态数组,称为 VLA。看下面的语法:
这是一个改进版本:
#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;
}