Tag: 记忆

在Windows下查找程序在c中使用的总内存

我在c中有一个小程序 #include #include #define SIZE 30 int main() { char name[ SIZE ]; FILE *fpPtr; if ( ( fpPtr = fopen( “sorted_file.txt”, “r” ) ) == NULL ) { printf( “File could not be opened\n” ); } else { printf( “%s\n”, “Name” ); fscanf( fpPtr, “%s”, name ); while( !feof( fpPtr ) ) { printf( […]

如何在C中获取结构的地址?

我是C的绝对新手所以这可能是一个愚蠢的问题,警告! 如果有人想知道背景,那么它的灵感来自于学习困难之路中的练习16的额外学分。 假设这些import: #include #include #include 给出一个像这样的简单结构: struct Point { int x; int y; }; 如果我在堆上创建它的实例: struct Point *center = malloc(sizeof(Point)); assert(center != NULL); center->x = 0; center->y = 0; 然后我知道我可以在内存中打印结构的位置,如下所示: printf(“Location: %p\n”, (void*)center); 但是如果我在堆栈上创建呢? struct Point offCenter = { 1, 1 }; 位于堆栈中的值仍然在内存中的某个位置。 那么我如何获得这些信息呢? 我是否需要创建指向我的新on-the-stack-struct的指针然后使用它? 编辑:哎呀,猜测这是一个显而易见的。 感谢Daniel和Clifford! 为了完整性,这里是使用&的打印示例: printf(“Location: %p\n”, (void*)&center);

ReadProcessMemory更快

我正在创建一个应用程序,它将使用鼠标/键盘(宏)模拟一个变量值的动作。 我在这里扫描了我制作的代码: void ReadMemory(int value){ DWORD primeiroAddress = 0x000000; DWORD finalAddress = 0xFFFFFF; DWORD address=0; std::ostringstream ss; int i=0; TListItem *ListIt; int valor; HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,TargetPID); if(!phandle){ ShowMessage(“Não encoutrou o processo”); }else{ for(address=primeiroAddress;address<=finalAddress;address+=sizeof(valor)){ ReadProcessMemory(phandle,(void*)address,&valor,sizeof(valor),0); if(valor==value){ i++; ss << std::hex <Label5->Caption=i; ListIt = Form1->ListView1->Items->Add(); ListIt->Caption = AnsiString(ss.str().c_str()).UpperCase(); ListIt->SubItems->Add(IntToStr(valor)); ss.str(std::string()); } } } } 我想知道我能做些什么才能让扫描更快

存储类

声明为auto和static的变量之间有什么区别? auto和static变量的内存分配有什么不同? 为什么我们使用static指针数组及其意义是什么?

memmem是GNU扩展的特殊原因吗?

在C中, memmem函数用于定位存储区中的特定字节序列。 它可以被同化为strstr ,它专用于以null结尾的字符串。 这个函数是否有任何特殊原因可用作GNU扩展,而不是直接在标准库中? 手册说明: 这个function在Linux库中被破坏,包括libc 5.0.9; 在那里,针和干草堆参数互换,并返回指向第一次出现针的末尾的指针。 旧的和新的libc都有错误,如果针是空的,则返回haystack-1(而不是haystack)。 并且glibc 2.0使情况变得更糟,返回指向haystack的最后一个字节的指针。 这在glibc 2.1中得到修复。 我可以看到它经历了几个修复,但我想知道为什么它不像某些发行版上的strstr直接可用(如果不是更多)。 它是否仍然会带来实施问题? 编辑:动机。 如果标准memmem决定它,我不会问这个问题:包括memmem而不是strstr 。 实际上, strstr可能是这样的: memmem(str, strlen(str), “search”, 6); // or memmem(str, strlen(str) – 1, “search”, 6); 考虑到在C函数中通常需要数据块和它的长度 ,这是一个相当棘手的但仍然是一个非常合乎逻辑的单行。 编辑(2) :评论和答案的另一个动机。 引用Theolodis : 并非每个函数都是必需的,或者至少是大多数C开发人员,因此它实际上会使标准库变得不必要的巨大。 嗯,我完全同意,在使图书馆更轻,更快的时候,我总是在这里。 但那么……为什么strncpy和memcpy (来自keltar的评论)……? 我几乎可以问: 为什么可怜的记忆是“黑色的”?

缺少/ proc / pid / maps中的部分

我正在尝试一个不断分配内存的简单C程序: for ( i = 0; i < 10000; i ++ ) { array[i] = malloc( 1024*1024 ); if ( array[i] == NULL ) { break; } printf("Sleeping…%d\n", i); sleep( 60 ); } 完整代码粘贴在这里: http : //tny.cz/2d9cb3df 但是,当我cat /proc/pid/maps ,我没有[heap]部分。 为什么? 08048000-08049000 r-xp 00000000 08:11 17 /data/a.out 08049000-0804a000 r–p 00000000 08:11 17 /data/a.out 0804a000-0804b000 rw-p […]

ARM未对齐的内存访问解决方法

我必须将源代码移植到运行Linux的ARM平台。 不幸的是,我遇到了未对齐的内存访问问题。 源使用指针强制转换和访问。 像下面这样的代码像病毒一样遍布代码库。 由于gcc -Wcast-align命令行选项,我可以查明有问题的位置,但是有超过一千个实例要经历。 u = (IEC_BOOL); (((*(IEC_LINT*)pSP).H < bH) || (((*(IEC_LINT*)pSP).H == bH) && ((*(IEC_LINT*)pSP).L > u); *(IEC_DWORD OS_SPTR *)pSP = (IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP < bL))) ? 1 : 0); u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0); 使用echo 2 > /proc/cpu/alignment on会使Linux内核修复问题,但应用程序的性能会降低到不再可接受的程度。 我在网上搜索了类似于GCC(v4.4.1)编译器的__unaligned或__packed关键字,但截至目前为止还是空的。 我认为很多问题的代码行可以通过一个或多或少复杂的正则表达式/替换来修复,但现在,在我做了一段时间之后,我发现,这种方法也需要大量繁琐的工作。 你们有什么建议如何完成这项工作? 我认为一个gcc 4.5编译器插件会有点矫枉过正但是有没有比正则表达式好的东西? 您还能提出哪些其他建议? 不一定所有问题实例都必须修复,因为我仍然可以依赖内核来处理一些罕见的情况。

function占用内存空间吗?

void demo() { printf(“demo”); } int main() { printf(“%p”,(void*)demo); return 0; } 上面的代码打印了函数demo的地址。 因此,如果我们可以打印函数的地址,这意味着该函数存在于内存中并占用其中的一些空间。 那么它在内存中占据了多少空间?

zlib,deflate:要分配多少内存?

我正在使用zlib来压缩文本数据流。 文本数据以块为单位,对于每个块,调用deflate() ,flush设置为Z_NO_FLUSH 。 检索Z_FINISH所有块后,调用deflate()并将flush设置为Z_FINISH 。 当然, deflate()不会在每次调用时产生压缩输出。 它在内部累积数据以实现高压缩率。 那没关系! 每次deflate()产生压缩输出时,该输出都会附加到数据库字段 – 这是一个缓慢的过程。 但是,一旦deflate()产生压缩数据,该数据可能不适合提供的输出缓冲区deflate_out 。 因此需要多次调用deflate() 。 这就是我想要避免的: 有没有办法让deflate_out总是足够大,以便deflate()可以存储所有压缩数据,每次它决定产生输出? 笔记: 未压缩数据的总大小事先是未知的。 如上所述,未压缩数据以块的forms出现,压缩数据也以块的forms附加到数据库字段。 在包含文件zconf.h我发现了以下注释。 那也许是我在找什么? 即(1 << (windowBits+2)) + (1 << (memLevel+9)) deflate()可能产生的压缩数据的最大字节数deflate()以字节为单位deflate() ? /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + […]

编写getline()实现 – Valgrind错误

我必须重新getline()函数的实现,但是使用文件的文件描述符而不是FILE * 。 我只允许使用malloc()和free() ,以及最多25行的5个函数。 我想我已经正确完成了项目,虽然我是C语言的初学者,但我的代码可能并不好。 当我运行它,它工作正常,但valgrind显示我定义definetely lost x bytes ,x取决于文件长度和READ_SIZE(标头中定义的宏)。 根据valgrind的–leak-check=full ,当我使用malloc dest时,我在str_realloc_cat函数中有内存泄漏。 我试过但找不到我应该在哪里/做其他事情? 以下是我的代码: char *get_next_line(const int fd) { static char *remaining = “”; char *buffer; ssize_t cread; size_t i; i = 0; if (remaining == NULL) return (NULL); if ((buffer = malloc(SOF(char) * READ_SIZE + 1)) == NULL || (cread = read(fd, […]