0

I'm very new to C, this is a test program that i'm trying to make work. The purpose is to put the characters from one dynamically generated matrix into another. The code i've got compiles but never finishes running.

When I comment out the loop at the bottom it will do the printf statement fine, but when I uncomment it it just keeps running and doesn't print. I though C worked sequentially? If something in the loop is broken why is it affecting the printf statement?

Here is the code:

#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

这里有多个问题:

第一个问题:您在为它们分配任何有效值之前都在使用它们(因此它们的初始值很可能很大)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元素,并且存储在其中的每个数组都将具有n元素。您的其他代码期望完全相反。

于 2013-08-29T23:31:06.883 回答
2

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

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

于 2013-08-29T23:27:44.777 回答
1

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

于 2013-08-29T23:27:09.947 回答
0

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

于 2013-08-29T23:31:37.170 回答