函数调用不打印2D数组表示

时间:2017-12-02 06:31:37

标签: c arrays

我正在根据用户输入的幻灯片宽度(只能是2,3,4)在C中实现滑动拼图程序。我觉得我的语法对于创建2D数组是正确的(这是我们用来表示后面函数中的数字),但是,我的函数没有被正确调用。相反,当我尝试运行它时,它就会挂起。

我无法更改函数的语法,因为我们需要在程序中使用它。所以我想知道它是否是一个传递main函数的程序。我感谢任何帮助。谢谢。

int main() {                                                                    
int w; /*variable asking for width*/                                            

 printf("Width: ");                                                          
 scanf("%d\n", &w); /*&w will refer to make_tiles when function is called*/  
  make_tiles(w);                                                              
  return 0;                                                                   
}                                                                                                                                                            
int **make_tiles(int width) {                                                    
int **tiles;                                                                    
int counter = 0;                                                                
int i, j;                                                                       
tiles[i] = (int*) malloc(width*sizeof(int*));                               
for(i = 0; i < width; i++) {                                                    
for(j = 1; j < width; j++) {                                                
tiles[i][j] = counter++;                                                    
printf(" %d", tiles[i][j]);                                                       
}                                                                          
printf("\n");                                                               
}                                                                            
}             

1 个答案:

答案 0 :(得分:1)

这里有未定义的行为。您忘记在tiles[i]中分配内存。 i也未被充分利用。访问未分配的内存也是未定义的行为。

int **tiles;                                                                    
int counter = 0;                                                                

tiles  = malloc(width*sizeof*tiles); 
if( tiles == NULL){
    fprintf(stderr,"Error in malloc");
    exit(1);
}                              
for(i = 0; i < width; i++) {
  tiles[i] = malloc(sizeof *tiles[i] * width);
  if( tiles[i] == NULL){
     fprintf(stderr,"Error in malloc");
     exit(1);
  }

}

您没有从方法中返回任何内容。你也应该释放分配的内存。

如果您注意到此代码,您将看到我没有转换malloc的返回值,因为这是不必要的。如果您忘记包含stdlib.h标题,也会在评论中提及。 (因为在C11之前,未声明的函数被认为返回int,如果大小不同于int*,则会导致错误的结果。

示例代码:

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

int** make_tiles(int w);

int main() {
    int w; /*variable asking for width*/                                            

    printf("Width: ");                                                          
    if( scanf("%d", &w) != 1){
        fprintf(stderr, "Error in input");
        exit(1);
    }

    int **arr = make_tiles(w);  
    // you can work with arr here.   

    for(size_t i = 0; i < w ; i++)
        free(arr[i]);  
    free(arr);                                                       
    return 0;                                                                   
}                                                                                                                                        
int **make_tiles(int width) {                                                    
    int **tiles;                                                                    
    int counter = 0;                                                                

    if( width <= 0 ){
        fprintf(stderr,"%s\n","Error : Specify correct width [>=0]");
        exit(1);
    }
    tiles  = malloc(width*sizeof*tiles); 
    if( tiles == NULL){
        fprintf(stderr,"Error in malloc");
        exit(1);
    }                              
    for(size_t i = 0; i < width; i++) {
      tiles[i] = malloc(sizeof *tiles[i] * width);
      if( tiles[i] == NULL){
         fprintf(stderr,"Error in malloc");
         exit(1);
      }
    }  
    for(size_t i = 0; i < width ; i++){
        for(size_t j = 0; j < width ;  j++){
            tiles[i][j] = counter++;
            printf("%4d ", tiles[i][j]);

        }
        printf("%s","\n");
    }     
    return tiles;                                              
}