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 文字 (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 に答える