C代码无法完成运行

时间:2013-08-29 23:24:31

标签: c

我是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 个答案:

答案 0 :(得分:3)

这里有多个问题:

第一个问题:在为它们分配任何有效值之前,您同时使用mn。(因此它们的初始值很可能很大)。

第二个问题:你的界限不足了:

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,最后一个元素将低于元素数量(例如,具有x元素的数组将基本上从array[0]转到array[x-1])。

如果您的数组有一个元素(matrix[n]解析为matrix[1]),您只能访问matrix[0]matrix[1]将超出范围(即未定义)行为;不要这样做!)。

第三个问题:您分配指针的方式是交换维度:matrix将包含m个元素,并且存储在其中的每个数组都将具有{{1元素。您的其他代码要求完全相反。

答案 1 :(得分:2)

首先,您正在main()中执行malloc调用,而不将值赋给m和n。在malloc调用之前移动n = 1和m = 2语句。

第二,利用n和m的这些值以及矩阵[n] [m]的定义,你不能访问矩阵[1] [1]和矩阵[1] [2] - 最大索引需要是n-1和m-1,因为C使用从零开始的索引来访问数组元素。

答案 2 :(得分:1)

简单的一个 - m未初始化。

答案 3 :(得分:0)

主要规则:在使用任何变量之前指定值。在你的m中,m没有初始化。调试中的某些编译器可以帮助您初始化变量。但大多数人都没有。