我正在根据用户输入的幻灯片宽度(只能是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");
}
}
答案 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;
}