我是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];
}
}
答案 0 :(得分:3)
这里有多个问题:
第一个问题:在为它们分配任何有效值之前,您同时使用m
和n
。(因此它们的初始值很可能很大)。
第二个问题:你的界限不足了:
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没有初始化。调试中的某些编译器可以帮助您初始化变量。但大多数人都没有。