你好,我在使用指针声明二维数组时遇到问题。我是C的新手。
int main(){
int x = 0;
int y = 0;
int *xdim;
int *ydim;
printf("Enter x:\n");
scanf("%d", &x);
printf("Enter y:\n");
scanf("%d", &y);
xdim = &x;
ydim = &y;
char sq[xdim][ydim];
return 0;
}
我希望二维数组char sq保存用户输入的值。我得到错误非整数类型* int。我也是新手。
答案 0 :(得分:1)
使用VLA(在C99中允许,或作为许多编译器的扩展),您需要做的就是:
int xdim, ydim;
scanf("%d %d", &xdim, &ydim);
char vla_array[xdim][ydim];
如您所见,不需要指针。
第二个选项是使用“普通”数组。您需要声明一个足够大的数组,并且只使用它的一部分:
#DEFINE X_MAX_DIM 100
#DEFINE Y_MAX_DIM 100
char vla_array[X_MAX_DIM][Y_MAX_DIM];
int xdim, ydim;
scanf("%d %d", &xdim, &ydim);
// check xdim and ydim are acceptable sizes
// from now on you use up to `xdim x ydim` of your array, even if
// it was declared as `100x100`
只有在事先知道阵列允许的最大尺寸时,才能使用此功能。
第三种选择是使用动态分配。如果阵列非常大,这是唯一的选择。然而,这是一个高级主题,因此您现在不会处理此问题。
答案 1 :(得分:1)
int** ptr = NULL;
ptr = new int*[val];
for(int i=0; i < val; i++)
{
ptr[i] = new int[val];
}
上面的代码分配val * val的二维数组
答案 2 :(得分:0)
将char sq[xdim][ydim];
更改为char sq[*xdim][*ydim];
,否则您会传递值的位置而不是值本身。
但在这种情况下不必使用指针,您可以使用x
和y
。
答案 3 :(得分:0)
在您播放的代码中发生错误,因为在此声明中
char sq[xdim][ydim];
使用了指针xdim
和ydim
而不是整数。你可以写
char sq[*xdim][*ydim];
虽然没有必要这样使用指针。
如果您的编译器支持可变长度数组,那么您可以编写
int main( void )
{
size_t m = 0;
size_t n = 0;
printf("Enter x:\n");
scanf("%zu", &m);
printf("Enter y:\n");
scanf("%zu", &n);
if ( !m || !n ) return 1;
char sq[m][n];
//...
return 0;
}
否则,您必须动态分配数组。例如
#include <stdlib.h>
int main( void )
{
size_t m = 0;
size_t n = 0;
printf("Enter x:\n");
scanf("%zu", &m);
printf("Enter y:\n");
scanf("%zu", &n);
if ( !m || !n ) return 1;
char **sq = malloc( m * sizeof( char * ) );
for ( size_t i = 0; i < m; i++ ) sq[i] = malloc( n * sizeof( char ) );
//...
for ( size_t i = 0; i < m; i++ ) free( sq[i] );
free( sq );
return 0;
}
答案 4 :(得分:0)
我相信,如果我明白你的要求,这应该有用。
在2D数组中使用单个指针;
#include <stdio.h>
#include <stdlib.h>
int x = 0, y = 0;
char *arr = (char *)malloc(x * y * sizeof(int));