小编Cir*_*red的帖子

为什么`int(*array)[10] = malloc(...);`有效的C代码?

我最近遇到了以下情况:

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时,我觉得我看到了回来的东西,但谷歌搜索并没有帮助我理解.使用术语"指针","解除引用"和"初始化"进行搜索显然会给结果带来污染,这些结果会跟踪人们如何跟踪解除引用等等.我希望人类可以帮助我.

c arrays malloc syntax pointers

6
推荐指数
3
解决办法
813
查看次数

在动态分配的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
查看次数

scipy.interpolate.interp1d是否存在导致x值的十进制值问题?

我正在尝试使用scipy中的interp1d()来插入一些数据,但是我一直在输出out或range错误.经过几个小时的谷歌搜索,我现在知道x值不按递增顺序将导致我得到的相同错误,但我已经确定这不是问题.据我所知,看起来interp1d()不喜欢第一个值中的小数.我错过了什么吗?

我的问题的简化版本:

以下运行很好.

import numpy as np
from scipy.interpolate import interp1d

interp1d(np.array([1, 2, 3, 4, 5, 6]),
         np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
Run Code Online (Sandbox Code Playgroud)

但是这个:

interp1d(np.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6]),
     np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
Run Code Online (Sandbox Code Playgroud)

返回:

ValueError:x_new中的值低于插值范围.

但是,这很好用.

interp1d(np.array([1.0, 2.2, 3.3, 4.4, 5.5, 6.6]),
         np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
Run Code Online (Sandbox Code Playgroud)

python interpolation scipy

2
推荐指数
1
解决办法
5244
查看次数

为什么MersenneTwister似乎为同一种子生成不同的序列?

执行中:

using Random

rng1 = MersenneTwister(42)
rng2 = MersenneTwister(42)

v = [ x for _ = 1:4, x = rand(rng1) ]
w = [ rand(rng2) for _ = 1:4 ]

print("$(v)\n$(w)\n")
Run Code Online (Sandbox Code Playgroud)

生成以下输出:

[0.533183、0.533183、0.533183、0.533183]
[0.533183、0.454029、0.0176868、0.172933]

两个序列不应该相同吗?我想念什么?

我在多个系统上都得到了相同的结果,而与是否创建vfirst或无关w

random julia random-seed

2
推荐指数
1
解决办法
68
查看次数