如何使用new声明二维数组?
就像,对于"普通"数组,我会:
int* ary = new int[Size]
Run Code Online (Sandbox Code Playgroud)
但
int** ary = new int[sizeY][sizeX]
Run Code Online (Sandbox Code Playgroud)
a)不工作/编译和b)没有完成什么:
int ary[sizeY][sizeX]
Run Code Online (Sandbox Code Playgroud)
确实.
关于C中的多维数组,我已经看过几十个关于"我的代码有什么问题"的问题.出于某种原因,人们似乎无法理解这里发生的事情,所以我决定回答这个问题作为对其他人的参考:
如何在C中正确设置,访问和释放多维数组?
如果其他人有有用的建议,请随时发布!
如果我像这样分配一个2D数组[N] [N] ; 它将分配一个连续的内存块.
但是,如果我尝试动态这样做:
int **a = malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++)
a[i] = malloc(cols * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
这样可以在行中的元素之间保持单位跨度,但行之间可能不是这种情况.
一种解决方案是从2D转换为1D,除此之外,还有另一种方法吗?
这个答案的评论部分中的一个论点促使我提出这个问题.
在以下代码中,bar指向可变长度数组,因此sizeof在运行时而不是编译时确定.
int foo = 100;
double (*bar)[foo];
Run Code Online (Sandbox Code Playgroud)
该论点是关于sizeof当操作数是可变长度数组时是否使用计算其操作数,在未初始化sizeof(*bar)时产生未定义的行为bar.
是否使用未定义的行为,sizeof(*bar)因为我正在取消引用未初始化的指针?sizeof当类型是可变长度数组时,是实际评估的操作数,还是仅确定其类型(sizeof通常如何工作)?
编辑:每个人似乎都引用了C11选秀中的这段话.有谁知道这是否是官方标准中的措辞?
我最近遇到了以下情况:
int ( *array )[10] = malloc(...);
Run Code Online (Sandbox Code Playgroud)
基于我对C语法和语法的理解,这看起来像废话.看起来像正在创建(并初始化)一个数组,其中取消引用指针的值作为其标识符.
我理解指向数组的指针,并且通常至少使用malloc()在堆上分配它们.例如,这是有道理的:
int *array = malloc(sizeof (int*) * 10);
Run Code Online (Sandbox Code Playgroud)
...但是,第一个例子看起来像不应该编译的乱码.显然,我错过了一些东西.
当我学习C时,我觉得我看到了回来的东西,但谷歌搜索并没有帮助我理解.使用术语"指针","解除引用"和"初始化"进行搜索显然会给结果带来污染,这些结果会跟踪人们如何跟踪解除引用等等.我希望人类可以帮助我.
这是有很多答案但没有一个能解决具体问题的问题之一。
\n我尝试查看所有这些帖子 \xe2\x80\x94\n 1 2 3 4 5 6 7 8 9 \ xe2\x80\x94 ,每次解决方案都是使用 VLA、使用具有固定尺寸的普通数组,或使用指针到指针。
\n我想要的是分配:
\n所以,如果我跳过了一篇文章,或者没有读得足够透彻,满足了这些要求,请指出它。
\n否则,我会要求您对此进行教育,并告诉我这是否可能,如果可能,该怎么做。
每次我为2D数组分配内存时,我首先创建一个数组,int**然后使用for我为每个元素分配内存.
例如:
int ** arr = malloc(N*sizeof(int *));
for(i=0; i< N; i++) arr[i] = malloc(M*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
不可能像以下那样分配内存:
int ** arr = malloc(N*sizeof(int[M]));
Run Code Online (Sandbox Code Playgroud)
要么
int ** arr = malloc(sizeof(int[N][M]));
Run Code Online (Sandbox Code Playgroud)
为了避免for?