0
#include <stdio.h>
#include <malloc.h>
char * define_row(int n)
{
    char * row=(char *)calloc(sizeof(char),n);
    row[0]='5';
    return row;

}


char ** define_matrix(int n,int m)
{
    char ** rows=(char **)calloc(sizeof(char),n);
    int i;
    for(i=0;i>0;i++)
    {
        rows[i]=define_row(m);
    }
    return rows;
}
void main()
{
    int n=5,m=5;
    char **k;
    k=define_matrix(n,m);
    printf("%d",&k[0][0]);

}

代码应该为大小为 NxM 的矩阵分配内存,但我现在正在测试 5x5。运行代码时,它确实打印了一个 0 ,但是当我添加时

void main()
{
    int n=5,m=5;
    char **k;
    k=define_matrix(n,m);
    k[0][0]=5;
    printf("%d",&k[0][0]);

}

它突然在运行中崩溃,我的代码有什么问题?

4

3 回答 3

2

首先:

for (i = 0; i > 0; i++)

看起来很奇怪。它可能会导致未定义的行为,因为i可能会溢出。

你可能宁愿写:

for (i = 0; i < n; i++)

此外,您没有分配足够的内存来使用rows[i]. sizeof(char)是一个字符(1 个字节)的大小,但是rows[i]是一个指针。

char **rows = calloc(sizeof(char), n);

可能变成:

char **rows = calloc(sizeof *rows, n); /* ie sizeof(char *), n */
于 2013-06-15T18:30:06.180 回答
1

这是一个问题。您的线路:

char ** rows=(char **)calloc(sizeof(char),n);

应该:

char ** rows=(char **)calloc(sizeof(char*),n);

因为您将地址填充到分配了 8 位值的数组位置中。

于 2013-06-15T18:29:47.447 回答
0

for循环define_matrix不终止。

你需要改变

for(i=0;i>0;i++)
{
    rows[i]=define_row(m);
}

//------- use n instead of 0
for(i=0;i<n;i++) 
{
    rows[i]=define_row(m);
}
于 2013-06-15T18:30:35.810 回答