0

私はCに非常に慣れていません。これは、私が機能させようとしているテストプログラムです。目的は、動的に生成されたあるマトリックスの文字を別のマトリックスに配置することです。私が持っているコードはコンパイルされますが、実行が終了しません。

一番下のループをコメントアウトすると、printfステートメントは正常に実行されますが、コメントを外すと、実行され続けて印刷されません。私はCがシーケンシャルに働いていましたか?ループ内の何かが壊れている場合、それが printf ステートメントに影響を与えるのはなぜですか?

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void main (void)
{
int n,m,i;
char **matrix = (char**) malloc(m * sizeof(char*));
    for ( i = 0; i < m; i++ )
    {
    matrix[i] = (char*) malloc(n * sizeof(char));
    }

char **oldMatrix = (char**) malloc(m * sizeof(char*));
    for ( i = 0; i < m; i++ )
    {
    oldMatrix[i] = (char*) malloc(n * sizeof(char));
    }   

n=1; 
m=2;    
int indc;
matrix[n][m];
matrix[1][1]='1';
matrix[1][2]='2';
oldMatrix[1][2];
printf("%c %c",matrix[1][1],matrix[1][2]);

int r=0;    

            for (indc=0; indc<=1; indc++)
            {
            printf("4");
            oldMatrix[r][indc]=matrix[r][indc];
            }

}
4

4 に答える 4

3

ここに複数の問題があります:

最初の問題:有効な値を割り当てる前に両方mを使用しnています(そのため、初期値はおそらく巨大です)。

2 番目の問題:限界を超えています:

n=1; 
m=2;    

matrix[n][m];     // this line doesn't do anything
matrix[1][1]='1';
matrix[1][2]='2';

C (および C++) では、配列インデックスは 0 から始まるため、配列の最初の要素は 0 になり、最後の要素は要素数の 1 つ下になります (たとえば、x要素を持つ配列は基本的に からarray[0]に移動しarray[x-1]ます)。

配列に 1 つの要素 (matrix[n]に解決される) がある場合、matrix[1]アクセスできるのは のみです。matrix[0]matrix[1]

3 番目の問題:次元を交換しているポインターを割り当てる方法:要素matrixmあり、その中に格納されているすべての配列にn要素があります。あなたの他のコードは正反対のことを期待しています。

于 2013-08-29T23:31:06.883 に答える
0

主なルール: 変数を使用する前に値を割り当てます。あなたのmでは、mは初期化されていません。デバッグ中の一部のコンパイラは、変数の初期化に役立つ場合があります。しかし、ほとんどはそうではありません。

于 2013-08-29T23:31:37.170 に答える