Tag: 内存

Valgrind报告空C程序的未初始化值

我用gcc test.c或clang test.c编译了这个C程序: int main (void) { return 0; } valgrind ./a.out给了我这个: ==9232== Memcheck, a memory error detector ==9232== Copyright (C) 2002-2011, and GNU GPL’d, by Julian Seward et al. ==9232== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==9232== Command: ./a.out ==9232== ==9232== Conditional jump or move depends on uninitialised value(s) ==9232== […]

C – 交换两个相同大小的内存块的最快方法?

交换两个相同大小的非重叠内存区域的最快方法是什么? 说,我需要用(t_Some *b)交换(t_Some *b) 。 考虑到时空权衡,会增加临时空间来提高速度吗? 例如, (char *tmp) vs (int *tmp) ? 我正在寻找便携式解决方案。 原型: void swap_elements_of_array(void* base, size_t size_of_element, int a, int b);

什么可以解释对free()的调用堆腐败?

我已经调试了几天的崩溃,这发生在OpenSSL的深处(与维护者讨论)。 我花了一些时间进行调查,所以我会尝试让这个问题变得有趣且内容丰富。 首先,为了给出一些上下文,我重现崩溃的最小样本如下: #include #include #include #include #include #include int main() { ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); ENGINE_load_builtin_engines(); EC_GROUP* group = EC_GROUP_new_by_curve_name(NID_sect571k1); EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED); EC_KEY* eckey = EC_KEY_new(); EC_KEY_set_group(eckey, group); EC_KEY_generate_key(eckey); BIO* out = BIO_new(BIO_s_file()); BIO_set_fp(out, stdout, BIO_NOCLOSE); PEM_write_bio_ECPrivateKey(out, eckey, NULL, NULL, 0, NULL, NULL); // <= CRASH. } 基本上,此代码生成椭圆曲线键并尝试将其输出到stdout 。 类似的代码可以在openssl.exe ecparam和Wikis online上找到。 它在Linux上运行正常(valgrind报告根本没有错误)。 它只在Windows上崩溃(Visual Studio 2013 […]

什么是DOS中字符表的内存地址?

DOS中字符表的地址是什么,我们可以通过操纵每个字符的像素来创建新的字体和符号? 我知道用BIOS中断来改变它,但是我只需要dos中字符表的内存地址来直接访问。

内存映射显示的RAM多于实际可用内存

我正在研究一个小的x86内核。 我正在访问并尝试读取GRUB在多引导头中提供的内存映射。 我有一个Intel i3 cpu和4 GiB的RAM。 在这台机器上运行时,我正在阅读以下内存映射: –Base Address– –Length– –Type– 0x0000000000000000 0x000000000009d000 0x1 0x000000000009d000 0x0000000000003000 0x2 0x00000000000e0000 0x0000000000020000 0x2 0x0000000000100000 0x00000000bb53f000 0x1 0x00000000bb63f000 0x0000000000080000 0x2 0x00000000bb6bf000 0x0000000000100000 0x4 0x00000000bb7bf000 0x0000000000040000 0x3 0x00000000bb7ff000 0x0000000000001000 0x1 0x00000000bb800000 0x0000000004800000 0x2 0x00000000e0000000 0x0000000010000000 0x2 0x00000000feb00000 0x0000000000004000 0x2 0x00000000fec00000 0x0000000000001000 0x2 0x00000000fed10000 0x0000000000004000 0x2 0x00000000fed18000 0x0000000000002000 0x2 0x00000000fed1b000 0x0000000000005000 […]

使用Malloc在C中定义结构

我之前问了一个关于使用malloc定义结构的问题 。 这是大多数人给出的答案: struct retValue* st = malloc(sizeof(*st)); 我向朋友展示了我的代码,我们遇到了绊脚石。 有人可以解释为什么这段代码有效吗? 从我的观点来看,当你使用malloc时没有定义* st,因此那里可能存在任何类型的垃圾。 它应该是malloc(sizeof(struct retValue)) 谢谢你的帮助

静态内存实例中的字符串计数

据我所知,编译时类C字符串只作为一个实例保存在静态内存中。 例如,我在下面的gcc 4.6运行示例中得到了同样的结果。 但我想知道它总是真的可以携带。 C和C ++上的行为很有趣。 #include bool amIportable(const char* value) { const char* slocal = “Hello”; return (slocal==value); } int main() { const char* s = “Hello”; std::cout << std::boolalpha << amIportable(s) << '\n' << amIportable("Hello") << '\n'; }

某个程序的堆栈内存有多大,是否有可以设置它的编译器标志?

正如标题所述:关于堆栈的大小是否有任何一般的“经验法则”。 我猜测大小会有所不同,具体取决于操作系统,体系结构,缓存大小,可用RAM数量等。 但是一般可以说什么,或者有没有办法找出,有多少堆栈, 这个程序是允许使用的? 作为一个额外的问题是有任何方式(使用编译器标志等(在这里主要考虑C / C ++,但也更通用))堆栈的大小可以由用户设置为固定大小? 顺便说一句,我严格要求出于好奇,我没有堆栈溢出。 🙂

使用sprintf而不使用手动分配的缓冲区

在我正在处理的应用程序中,日志记录工具使用sprintf来格式化写入文件的文本。 所以,像: char buffer[512]; sprintf(buffer, … ); 当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题。 有没有办法获得sprintf行为而无需像这样手动分配内存? 编辑:虽然sprintf是一个C操作,我正在寻找C ++类型的解决方案(如果有的话!)让我得到这种行为……

将MachineCode从文件加载到内存并执行C – mprotect失败

嗨,我正在尝试将原始机器代码加载到内存中并在C程序中运行它,现在当程序执行时,它试图在内存上运行mprotect以使其可执行时中断。 我也不完全确定如果内存设置正确,它将执行。 我目前在Ubuntu Linux x86上运行它(也许问题是Ubuntu的过度保护?) 我目前拥有以下内容: #include #include #include int main ( int argc, char **argv ) { FILE *fp; int sz = 0; char *membuf; int output = 0; fp = fopen(argv[1],”rb”); if(fp == NULL) { printf(“Failed to open file, aborting!\n”); exit(1); } fseek(fp, 0L, SEEK_END); sz = ftell(fp); fseek(fp, 0L, SEEK_SET); membuf = […]