Tag: 记忆

Microsoft SDL和memcpy弃用

正如你们中的一些人可能知道的那样, 微软从他们的安全开发生命周期中取消了memcpy() ,将其替换为memcpy_s() 。 void *memcpy(void *dest, const void *src, size_t n); /* simplified signature */ errno_t memcpy_s(void *dst, size_t dstsize, const void *src, size_t n); 因此,如果您的代码曾经是: if (in_len > dst_len) { /* error */ } memcpy(dst, src, in_len); 它成为了: if (memcpy_s(dst, dst_len, src, src_len)) { /* error */ } 或者,截断, memcpy(dst, src, min(in_len, dst_len)); […]

Valgrind在尝试释放malloc’ed结构时报告内存错误

当前一个malloc’ed结构被释放时,Valgrind总是唠叨存在内存错误。 结构如下所示: typedef struct bullet { int x, y; struct bullet * next; } BULLET; …我通过使用分配内存 BULLET * b; b = malloc(sizeof(BULLET)); // sizeof(BULLET) is 16 然后,通过简单地调用free(b); ,结构是free(b); 。 然而Valgrind似乎并不满足于此,所以它告诉我 ==2619== Invalid read of size 8 ==2619== at 0x40249F: ctrl_bullets (player.c:89) ==2619== by 0x405083: loop_game (game.c:305) ==2619== by 0x406CCA: main (main.c:47) ==2619== Address 0x5b8d818 is […]

获取两个内存地址之间的差异

我有一个int *的内存地址:0xbfde61e0。 我还有另一个内存地址(也是int * 。如何计算两者之间的差异用作两个位置之间的偏移量?

在C中将Char数组转换为Long

这个问题可能看起来很傻,但请指导我,我有一个函数将长数据转换为char数组 void ConvertLongToChar(char *pSrc, char *pDest) { pDest[0] = pSrc[0]; pDest[1] = pSrc[1]; pDest[2] = pSrc[2]; pDest[3] = pSrc[3]; } 我将上述函数称为这样 long lTemp = (long) (fRxPower * 1000); ConvertLongToChar ((char *)&lTemp, pBuffer); 哪个工作正常。 我需要一个类似的function来反转过程。 将char数组转换为long。 我不能使用atol或类似的function。

C将内存部件移动到位

我正在实现几个数据结构和一个我要使用的原语如下:我有一个内存块A [N](它有一个可变长度,但我的示例为100)并且在这个块中,有一个较小的部分长度为K的C(比方说30)我想要移动而不使用任何额外的内存。 另外的困难是,A“包裹”,即C可以从A [80]开始,然后C的前20个元素是元素A [80..100],最后10个元素是元素A [ 0..10]。 此外,目标范围还可以以任何可能的方式“包裹”并与C重叠。 另外,我不想使用超过一定数量的额外内存,一切都应该到位。 此外,既不在目标范围内也不在源范围内的A部分可能包含重要的内容,因此也不能使用。 所以一个案例如下: A看起来像这样: | 456789ABCDEF0123456789AB | —– | 0123 | 应该转变为: | 89AB | —– | 0123456789ABCDEF01234567 | 只是将它委托给一个库或者从库中使用另一个数据结构不是一个选项,我想自己理解这个问题。 在第一眼看来,我认为这可能不是微不足道的,但是一旦你区分了几个案例,它就会变得清晰,但现在我遇到了严重的麻烦。 当然,如果它们不重叠或不包装,则存在微不足道的情况,但至少如果两者同时发生,则会变得混乱。 你可以从一个自由的地方开始并移动属于那里的部分,然后你在其他地方创建另一个免费部分,很难跟踪你可以使用哪些部分。 也许我完全错过了一些东西,但即使我的特殊情况,如果目标范围没有包装也有近100行(虽然它的一半是断言和注释)我可以更新它以便它也处理一般情况下一些额外的索引计算,但如果有人有一个优雅而简短的解决方案,我将不胜感激。 直觉上我认为这应该是微不足道的,但我还没有看到最好的解决方案。 注意:有趣的情况当然是,如果C几乎和A一样大。如果| C | <N / 2,这是微不足道的。 编辑:使用超过一定量的额外标志/索引计数作为额外的内存,我想尽可能避免这种情况。 编辑:有些人想看我的代码。 我的问题相当抽象,所以我不想发布它,但也许有人看到了如何改进它。 这很糟糕,它只适用于目标从头开始(但是,可以很容易地改变)并且非常长的情况,但它可以在O(n)中没有额外的内存。 #include #include #include #include void move_part(int* A, size_t N, size_t target, size_t […]

使用C中的预取和缓存优化对arrays的线性访问

披露:我在programmers.stack上尝试过类似的问题,但那个地方离活动堆栈还差不多。 介绍 我倾向于使用大量的大图像。 它们也有多个序列,必须重复处理和播放。 有时候我使用GPU,有时候是CPU,有时候都是。 大多数访问模式本质上是线性的(来回),让我思考有关数组的更基本的事情,以及如何编写代码优化以在给定硬件上实现最大内存带宽(允许计算不阻塞读/写) 。 测试规格 我在2011年MacbookAir4,2(I5-2557M)上使用4GB RAM和SSD完成了这项工作。 除了iterm2之外,在测试期间没有其他任何东西在运行。 gcc 5.2.0(自制)带标志: -pedantic -std=c99 -Wall -Werror -Wextra -Wno-unused -O0带有额外的include和库标志以及框架标志,以便使用我倾向于使用的glfw计时器。 我可以在没有的情况下完成它,没关系。 当然,所有64位。 我已经尝试使用可选的-fprefetch-loop-arrays标志进行测试,但它似乎根本没有影响结果 测试 在堆上分配两个n bytes数组 – 其中n是8, 16, 32, 64, 128, 256, 512 and 1024 MB 一次将array初始化为0xff ,字节 测试1 – 线性拷贝 线性副本: for(uint64_t i = 0; i < ARRAY_NUM; ++i) { array_copy[i] = array[i]; […]

打印C程序中的当前地址

想象一下,我有以下简单的C程序: int main() { int a=5, b= 6, c; c = a +b; return 0; } 现在,我想知道表达式c = a + b的地址,即执行此添加的程序地址。 我有可能使用printf吗? 沿线的东西: int main() { int a=5, b= 6, c; printf(“Address of printf instruction in memory: %x”, current_address_pointer_or_something) c = a +b; return 0; } 我知道如何通过使用gdb然后使用info line file.c:line找到地址。 但是,我应该知道我是否也可以直接使用printf。

当我运行程序时,如何检查内存中为我的C程序分配的内存

嘿我想检查我运行时在内存中为我的C程序分配了多少内存,因为我想减少程序的大小如果我得到了我的程序使用了多少内存,那么它对我的帮助减小了大小。 所以任何人都可以告诉我如何在C中做到这一点?

指向其声明范围之外的局部变量的指针

假设我有一个表示PDF文档pdf的结构和一个表示其页面pdf_page的结构: typedef struct pdf_page { int page_no; pdf_page *next_page; char *content; } pdf_page; typedef struct { pdf_page *first_page, *last_page; } pdf; 从我的main() ,我调用create_pdf_file(pdf *doc) : void main() { pdf doc; create_pdf_file(&doc); // reading the linked list of pages here } 假设create_pdf_file是这些行: void create_pdf_file(pdf *doc) { for (int i = 0; i last_page->next_page = p; } […]

无法分配内存

在我的C代码中,我为2d数组double E[2000][2000];分配内存double E[2000][2000]; 但是当我运行它时会得到一个运行时错误Segmentation fault(core dumped) ,当我将数组大小减少到900左右时,代码运行正常。 为什么它显示运行时错误,因为双重占用64位内存(IEEE标准)所以代码应该占用大约32MB,这与ram大小相比并不多。如果在C中不支持,那么如果我的最大数量应该如何继续我必须存储的数据是4000000,每个都是浮点数。