C代码赢得';我跑不完

C代码赢得';我跑不完,c,C,我是C语言的新手,这是一个测试程序,我正在努力让它工作。目的是将一个动态生成的矩阵中的字符放入另一个矩阵中。我得到的代码可以编译,但从未完成运行 当我在底部注释掉循环时,它会很好地执行printf语句,但当我取消注释它时,它只会继续运行,不会打印。我以为C是按顺序工作的?如果循环中的某些内容被破坏,为什么会影响printf语句 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h>

我是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];
            }

}
#包括
#包括
#包括
真空总管(真空)
{
int n,m,i;
字符**矩阵=(字符**)malloc(m*sizeof(字符*);
对于(i=0;ifor(indc=0;indcEasy one-
m
未初始化。

Easy one-
m
未初始化。

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


其次,使用这些n和m的值以及矩阵[n][m]的定义,您无法访问矩阵[1][1]和矩阵[1][2]——最大索引必须是n-1和m-1,因为C使用从零开始的索引来访问数组元素。

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


其次,使用这些n和m值以及矩阵[n][m]的定义,您无法访问矩阵[1][1]和矩阵[1][2]——最大索引必须是n-1和m-1,因为C使用从零开始的索引来访问数组元素。

这里有多个问题:

第一个问题:在分配任何有效值之前,您同时使用了
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]
将超出范围(即未定义的行为;不要这样做!)


第三个问题:分配指针的方式是交换维度:
矩阵将有
m
元素,其中存储的每个数组都将有
n
元素。其他代码的预期正好相反。

这里有多个问题:

第一个问题:在分配任何有效值之前,您同时使用了
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]
将超出范围(即未定义的行为;不要这样做!)


第三个问题:分配指针的方式是交换维度:
矩阵将有
m
元素,其中存储的每个数组将有
n
元素。其他代码的要求正好相反。

主要规则:在使用任何变量之前赋值。在m中,m不是ini调试中的一些编译器可以帮助你初始化变量。但是

主规则:在使用任何变量之前赋值。在m中,m不是初始化的。调试中的一些编译器可以帮助初始化变量。但是大多数都没有。

你确定你是编译为C代码而不是C++吗?你从哪里得到THA的想法?t
void main(void)
是正确的吗?它不是正确的(可能除了某些嵌入式系统)。正确的定义是int main(void)
。如果您有一本C语言书建议
void main(void)`,请告诉我们它是哪一个,这样我们就可以警告人们远离它。在编译器中激活警告,这将为您节省很多麻烦。如果您使用gcc,请将
-Wall
传递给编译器。并在编译时打开-Wall以打开警告。您应该有大量警告,其中一些警告在分配t之前表示您正在使用m,n哼哼值。(编辑:ACK!@ SP击败我的秒!伟大的思想一样!)你不需要在C程序中铸造<代码> MalOC 的返回值。你确定你把它编译成C代码而不是C++吗?你从哪里得到的想法:<代码>空主(空)<代码>是正确的?它不是(除了某些嵌入式系统之外)。正确的定义是int main(void)
。如果您有一本C语言书建议
void main(void)`,请告诉我们它是哪一个,这样我们就可以警告人们远离它。在编译器中激活警告,这将为您节省很多麻烦。如果您使用gcc,请将
-Wall
传递给编译器。并在编译时打开-Wall以打开警告。您应该有大量警告,其中一些警告在分配t之前表示您正在使用m,nhem值。(编辑:ack!@sp beat my be seconds!伟大的头脑都是一样的!)在C程序中,您不需要强制转换
malloc
的返回值。+1用于发现两者之间的不匹配