在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
为什么会这样呢?
在C和/或C++中操作动态(所有维度直到运行时才知道)的多维数组的接受/最常用方法是什么.
我正在努力找到完成此Java代码的最简洁方法:
public static void main(String[] args){
 Scanner sc=new Scanner(System.in);
 int rows=sc.nextInt();
 int cols=sc.nextInt();
 int[][] data=new int[rows][cols];
 manipulate(data);
}
public static void manipulate(int[][] data){
   for(int i=0;i<data.length;i++)
   for(int j=0;j<data[0].length.j++){
         System.out.print(data[i][j]);       
   }    
}
(从std_in读取只是为了澄清维度直到运行时才知道).
编辑:我注意到这个问题非常受欢迎,即使它很老了.我实际上并不同意最高投票的答案.我认为C的最佳选择是使用一维数组,如Guge所说:"你可以分配行cols sizeof(int)并通过表[row*cols + col]来访问它."
C++有很多选择,如果你真的喜欢boost或stl,那么下面的答案可能更好,但最简单也可能最快的选择是使用C中的单维数组.
如果你想要[] []语法,那么在C和C++中另一个可行的选择是lillq在底部的答案是手动构建具有大量malloc的数组.
在我本科 C 编程课程的大部分时间里,我们学习了 C99,我们的讲师从不费心教我们 C99 和以前版本之间的主要区别。
我们最近被告知,我们可能会被要求在下一次考试期间使用 C89 实施解决方案。
我的问题是关于函数内部声明和使用的可变长度多维数组的使用。
在 C99 中,我可以有这样的功能:
void func(int cols, int mat[][cols], int rows);
而在 C89 中,VLA 和类似的装置是不合法的。有人告诉我,您需要改用指向指针的指针。所以像:
void func(int **mat, int cols, int rows);
但是,我在理解方面遇到了问题:
mat[i][j]吗?int **mat;吗?我认为您必须使用malloc(),但我很难弄清楚确切的声明语句。边问。仍然关于可变大小的矩阵,有人告诉我有这样的设置:
int rows, cols;
// get rows and cols from stdinput
int mat[rows][cols];
由于程序堆栈上的分配,这不是创建具有给定维度的矩阵的最佳方法。什么是更好的方法?
谢谢!
我有一个非常大的多维向量,它的大小一直在变化.当我只知道大小的良好近似时,是否有任何意义使用vector.reserve()函数.
所以基本上我有一个向量
A[256*256][x][y]
其中x在程序中的每次迭代中从0变为50,然后再次返回0.y值每次都可以不同,这意味着对于每个 
 [256*256][y]元素,矢量y可以具有不同的大小但仍然小于256;
所以为了澄清我的问题,这就是我所拥有的:
vector<vector<vector<int>>> A;
for(int i =0;i<256*256;i++){
  A.push_back(vector<vector<int>>());
  A[i].push_back(vector<int>());
  A[i][0].push_back(SOME_VALUE);
}
向向量添加元素......
A.clear();
在此之后,我再次从顶部做同样的事情.
何时以及如何为矢量预留空间.如果我已经正确地理解了这一点,如果我一直使用保留,因为我会一直改变大小,我会节省很多时间吗?
保留我的载体可能具有的最大尺寸的负面/正面是什么,[256*256][50][256]在某些情况下会是这样.
BTW.我知道不同的Matrix模板和Boost,但已经决定在这个上使用向量...
编辑: 我也想知道如何在多维数组中使用保留函数.如果我只保留二维向量,那么如果我超过第三维的容量,它会复制整个东西吗?
我想得到一个二维int数组arr,我可以通过arr [i] [j]访问.
据我所知,我可以宣布int arr[10][15];获得这样一个数组.在我的情况下,大小是可变的,据我所知,如果数组的大小不是硬编码但是我使用类似的变量,这种语法不起作用int arr[sizeX][sizeY].
什么是最好的解决方法?
所以我有一个我认为是菜鸟的问题。提前对此表示抱歉,并且语法因为英语不是我的主要语言。
所以我必须做一个跳棋游戏。我有一些结构,定义为
struct game {
int **board;
int xsize, ysize;
struct move *moves;
int cur_player;
};
struct coord {
int x, y;
};
struct move_seq {
struct move_seq *next;
struct coord c_old;
struct coord c_new; 
int piece_value;
struct coord piece_taken;
int old_orig;
};
struct move {
struct move *next;
struct move_seq *seq;
};
我必须使用该功能初始化一个结构游戏
struct game *new_game(int xsize, int ysize)
所以,这是我的问题。目前,我将 new_game 的 xsize 和 ysize 值始终设为 10 和 10。然后我初始化棋盘游戏,稍后我想分配它。
int black = 1;
int white = 5;
int **board; …我正在尝试实现类似于Conway的生活游戏的单元格网格。
虽然每个单独的网格在两个维度上都应具有固定的大小,但我希望有一个Grid结构可以在两个维度上都具有任意大小。
这类似于如何将数组设置为任意大小,但是一旦初始化后的数组将具有固定的大小。
这是我到目前为止的内容:
typedef struct Cell {
    int data;
    // stuff to be added later
} Cell;
typedef struct Grid {
    unsigned width;
    unsigned height;
    Cell cell[][];
} Grid;
Grid initGrid(unsigned width, unsigned height) {
    Grid g;
    g.width = width;
    g.height = height;
    g.cell = malloc( sizeof(Cell)*width*height );
    return g;
}
但是我收到以下编译时错误:
main.c|12|note: declaration of `‘cell’ as multidimensional array must have bounds for all dimensions except the first|
如何定义
Grid大小灵活的数据类型?
发布脚本:作为C新手,我认为以下方法会起作用:
typedef struct Grid {
    unsigned width;
    unsigned …c arrays struct multidimensional-array dynamic-memory-allocation
我正在尝试构建一个char数组来存储函数的返回值.在以下函数中,数据存储在*****valv**中.如何构建外部变量来访问数据?
int credis_lrange(REDIS rhnd, const char *key, 
                   int start, int end, char ***valv) 
{
  int rc;
  if ((rc = cr_sendfandreceive(rhnd, CR_MULTIBULK, "LRANGE %s %d %d\r\n", 
                                key, start, end)) == 0) 
  {
    *valv = rhnd->reply.multibulk.bulks;
    rc = rhnd->reply.multibulk.len;
  }
  return rc;
}
解:
char **elements;
int size = credis_lrange(this->redis,"object_2",600,603,&elements);
for (int i=0; i<size;i++) {
    cout << "element: " << elements[i] << endl; 
}
谢谢大家!
我已经编写了很长一段时间,但只是意识到我对一个非常基本的操作的混淆可能会混淆.
int array[10][10];
array[1][1] = 0;
这样就足够了 - 数组地址+(10*1 + 1)*sizeof(int)被赋值为0.
但是在做动态数组的时候呢?
int **array;
// malloc/new the base array of pointers - say 10 as above.
array = malloc(10 * sizeof(int *));
// through pointers and alloc each with ints - again 10 per row as above.
for(int i=0; i<10; i++) 
    array[i] = malloc(10 * sizeof(int);
array[1][1] = 0;
在此示例中,编译器必须引用数组第一层上的数组以获取第二个指针以获取内存.同样,这个过程是直截了当的.
我的问题是:编译器如何知道内存是连续的,因此在第一个例子中它只能做简单的数学而不是引用,而不是第二个?
如果答案是:因为编译器事先知道数组的大小,所以就是这样,但有没有办法告诉编译器动态数组是单个分配,因此它可以做更简单的数学而不是额外的deref和额外的内存碎片分配?或者这是否需要VLA支持才能按照此帖发布,如下所示:
double (*A)[n] = malloc(sizeof(double[n][n]));
另一个网站也列出了这种可能性:
int r=3, c=4;
int **arr;
arr  = (int **)malloc(sizeof(int *) * …如果我有以下指针变量声明:
int*a;
int**c;
关于每种类型和价值,将如下:
a是类型int*,并将持有memory address
*a是类型int,并将保存指针指向的变量的值
c是类型int**,并将举行???????????????????
c*是类型int*,并将保持它指向的指针的内存地址
c**是类型int,并假设指针c指向指针b,指针b指向变量a,这里保持的值将是变量的值a
这种方式是否正确,除非c我不确定?
谢谢.
我有一个二维数组指针的问题.指针应指向可变大小的数组.
// create pointer to 2 dimensional array
TimeSlot **systemMatrix; // this is a global variable
在一个函数中我想创建一个新数组.
void setup(uint16_t lines, uint16_t coloumns) {
    // create 2 dimensional array. size can be set here.
    TimeSlot tmpTimeSlots[lines][coloumns];
    // make the pointer point to this array
    systemMatrix = tmpTimeSlots; // WARNING
}
但是当我让指针指向数组时,编译器会说"警告:从不兼容的指针类型中分配".此外,当从另一个函数访问systemmatrix [2] [5]时,运行软件的mikrocontroller会出现硬故障.
稍后在访问tmpTimeSlots的元素时需要变量systemMatrix.
我试过像这样的组合
systemMatrix = *(*tmpTimeSlot);
等等,但它们似乎都没有用.
任何帮助表示赞赏:)谢谢!
编辑:好的问题理解和解决,非常感谢!
我正在学习C并尝试编写此功能
int *create_matrix(int n) {
   int *matrix = malloc(n*n*sizeof(int));
   srand(time(NULL));
   int i, j;
   for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
        matrix[i][j] = rand()%10;
      }
   }
   return matrix;
}
为什么这不能编译?它的抱怨matrix[i][j]不是指针/数组.但我刚刚宣布它为指针六行以上......