相关疑难解决方法(0)

指向数组/指针数组的C指针消歧

以下声明之间有什么区别:

int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
Run Code Online (Sandbox Code Playgroud)

理解更复杂的声明的一般规则是什么?

c arrays pointers variable-declaration

451
推荐指数
6
解决办法
38万
查看次数

分配二维数组的怪异方式?

在一个项目中,有人推动了这一行:

double (*e)[n+1] = malloc((n+1) * sizeof(*e));
Run Code Online (Sandbox Code Playgroud)

据推测,这会创建一个(n + 1)*(n + 1)双倍的二维数组.

据说,我说,因为到目前为止,我没有人问我能告诉我它的作用,确切地说,它起源于何处或为什么它应该起作用(据称,它确实如此,但我还没有购买它).

也许我错过了一些明显的东西,但如果有人能够向我解释上述内容,我会很感激.因为就个人而言,如果我们使用我们真正理解的东西,我会感觉好多了.

c arrays malloc allocation multidimensional-array

110
推荐指数
3
解决办法
4766
查看次数

为什么在malloc中使用sizeof(*pointer)更安全

特定

struct node
{
     int a;
     struct node * next;
};
Run Code Online (Sandbox Code Playgroud)

要malloc一个新的结构,

struct node *p = malloc(sizeof(*p));
Run Code Online (Sandbox Code Playgroud)

比...更安全

struct node *p = malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)

为什么?我以为他们是一样的.

c malloc

41
推荐指数
3
解决办法
3万
查看次数

这些类型的指针有什么区别?

当我不小心将括号括在我的指针上并且我的程序输出发生了变化时,我用C++编写了一个代码.

由于我是编程新手,我想知道这些类型的指针之间的区别:

int* A[n]; 
int (*A)[n];
int *(A[n]);
Run Code Online (Sandbox Code Playgroud)

我在教科书中读过,数组也是一种指针.

c++ arrays pointers

8
推荐指数
1
解决办法
399
查看次数

在动态分配的2D数组上使用realloc()是个好主意吗?

我主要对缩小这样一个数组的可行性感兴趣.

我正在开发一个项目,我使用单个malloc()调用来创建各个中等大小的2D数组.(每个只有几十个MiB,最大的.)问题是,在其中一个阵列的生命周期中,其内容大小缩小(超过一半).显然,我可以在程序的生命周期中单独保留数组大小.(它只有一个具有GiB RAM的系统上的x MiB.)但是,我们正在谈论超过一半的分配空间在程序终止之前就被废弃了,并且,由于我使用的方式的性质数组中,所有幸存数据都保存在一组连续的行中(在块的开头).如果我真的不需要它,那么抓住所有RAM似乎是浪费.

虽然我知道realloc()可用于缩小动态创建的数组,但2D数组​​更复杂.我想我理解它的内存布局(因为我实现了构造它的函数),但这推动了我对语言及其编译器工作的理解的极限.显然,我将不得不处理行(并处理行指针),而不仅仅是字节,但我不知道所有这些的结果是多么可预测.

而且,是的,我需要使用单个malloc()创建数组.有问题的对象有几百万行.我尝试分别使用一个循环到malloc()每一行,但程序总是冻结在大约100,000 malloc()s.

对于后台,我用来构造这些数组的源代码如下:

char ** alloc_2d_arr(int cnum, int rnum) {
        /* ((bytes for row pointers + (bytes for data)) */
        char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char));

        /* Initialize each row pointer to the first cell of its row */
        char *p = (char *) (mtx + rnum);
        for (int i = 0; i < rnum; i++) {
                mtx[i] = p + i * …
Run Code Online (Sandbox Code Playgroud)

c arrays malloc memory-management multidimensional-array

5
推荐指数
1
解决办法
863
查看次数