Tag: 内存

为什么编译器将此变量初始化为错误的值? 这是对齐问题吗?

我正在使用嵌入式C编译器(ARM cortex-m3芯片),它似乎将错误的值初始化为结构。 为什么会这样? 如果是对齐问题,编译器是否应该知道将int32u与4字节边界对齐? 注意:printf只会抛出串行端口的字节。 这个芯片上没有stdio.h实现。 typedef struct { int32u startTime; int16u length; int32u offTime; } Cycle; Cycle cycle = { 315618000, 1200, 0 }; void init() { printf(“\r\nInitialized! Cycle Start: %d”, cycle.startTime); cycle.startTime = 315618000; cycle.length = 1200; printf(” Cycle Start: %d”, cycle.startTime); } 输出:初始化! 循环开始:631237200循环开始:315618000 注意::这不是printf问题。 调试器也会将内存中的值validation为631237200。

没有MMU的内存保护

我想知道如何在没有MMU支持的情况下保护内存。 我试图谷歌,但没有看到任何有价值的论文或研究。 那些处理它的人只会处理bug,例如未初始化的指针,而不会因软错误导致内存损坏,也就是说,由于硬件瞬态故障会破坏写入内存位置的指令。 我想知道这个的原因是因为我正在开发一个没有任何内存保护的专有多核平台。 现在我的问题是,软件可以用来保护内存,特别是由于软错误导致的疯狂写入(而不是程序员的错误)。 任何有关这方面的帮助将非常感激。

使用GCC + ARM减少递归期间的堆栈使用

我有一个用于嵌入式ARM处理器的递归下降解析器(在C + GCC中,用于ARM Cortex M3)。 在运行它的同时我注意到它使用了大量的堆栈空间(甚至超出了你的预期)并且经过仔细检查我发现这种情况正在发生: extern int bar(int *p); int foo() { int z = foo(); // it’s an example! int n[100]; // stack usage return z+bar(n); // calling bar(n) stops n from being optimised out } 运行arm-none-eabi-gcc -fomit-frame-pointer -S test.c的结果 foo: str lr, [sp, #-4]! ; Push link register sub sp, sp, #412 […]

如何从C中的“原始”内存中读取/写入类型值?

我如何制作这样的作品呢? void *memory = malloc(1000); //allocate a pool of memory *(memory+10) = 1; //set an integer value at byte 10 int i = *(memory+10); //read an integer value from the 10th byte

C ++三元运算符执行条件

我不确定C / C ++三元运算符的执行保证。 例如,如果给出一个地址和一个布尔值来告诉该地址是否适合阅读,我可以使用if / else轻松避免错误读取: int foo(const bool addressGood, const int* ptr) { if (addressGood) { return ptr[0]; } else { return 0; } } 但是,三元运算符( ?: addressGood可以保证除非addressGood为真,否则不会访问ptr ? 或者优化编译器是否可以生成在任何情况下访问ptr代码(可能使程序崩溃),将值存储在中间寄存器中并使用条件赋值来实现三元运算符? int foo(const bool addressGood, const int* ptr) { // Not sure about ptr access conditions here. return (addressGood) ? ptr[0] : 0; } […]

是否可以将不同的数据类型存储在C中相同的已分配内存中?

我想在同一个分配的内存中存储不同的数据类型,以便通过仅分配一次内存来减少执行时间。 我发现实际上可以创建一个uint8_t变量数组并创建一个指向同一内存地址的新uint16_t指针,然后我可以双向读取这些值。 这允许我创建一个指针,让我们说分配内存的中间,并将值存储在后半部分的不同数据类型中。 可以这样做吗? 我知道我需要关注内存边界,但这种风格是不是很糟糕? 这是我的代码: #include #include #include #include int main(void){ uint8_t *array; uint16_t *array2; array = calloc(6, 1); array[0] = 257; printf(“array[0]= %” PRIu8 “\n”, array[0]); printf(“array[1]= %” PRIu8 “\n”, array[1]); printf(“Adresse von array[0] = %p\n”, &array[0]); array2 = &array[0]; printf(“Adresse auf die array2 zeigt = %p\n”, array2); array2[0] = 257; printf(“array2[0]= %” […]

超出范围会释放(字符)数组的内存吗?

与我之前的问题非常相关,但我发现这是一个单独的问题,我无法找到一个可靠的答案。 是否超出范围释放(字符)数组使用的内存? 一个例子: void method1() { char str[10]; // manipulate str } 所以在method1调用之后,str(10字节)使用的内存是否被释放,或者我是否需要在此上显式调用free? 我的直觉告诉我这只是一个简单的原始类型数组,因此它会自动释放。 我有点怀疑,因为在C中你不能假设任何东西被自动释放。

内存扫描仪慢速扫描

我正在使用内存扫描仪,但扫描速度很慢..任何人都可以帮助我改进吗? procedure FirstScan(scantype, scanvalue: string); var value :integer; dwEndAddr : dword; i:dword; mbi : TMemoryBasicInformation; begin while (VirtualQuery(Pointer(DWORD(mbi.BaseAddress) + MBI.RegionSize), MBI, SizeOf(MEMORY_BASIC_INFORMATION))=SizeOf(TMemoryBasicInformation)) do begin if (MBI.State = MEM_COMMIT) and (MBI.Protect = PAGE_READWRITE) then begin dwEndAddr := DWORD(mbi.BaseAddress) + MBI.RegionSize; for i := DWORD(MBI.BaseAddress) to (dwEndAddr – 1 – sizeof(DWORD)) do begin Application.ProcessMessages; try if scantype […]

将变量放在特定地址会生成大型二进制文件

我必须将数组放在内存中的特定地址。 我正在使用GCC。 我声明变量如下: uint8_t __attribute__((section (“.mySection”))) buffer[1234]; 在链接器脚本中我得到了: MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 145K MYSEC (x) : ORIGIN = 0x20025000, LENGTH = 155K } 然后: .mySection : { *(.mySection); } > MYSEC 它当然是嵌入式系统(ARM)的代码。 通常我的程序需要22 KB,这个修改需要384 MB(!)。 我不明白为什么。 如果我删除__attribute__它再次需要22 KB。 我错过了什么? 使用的代码: […]

为什么malloc(1)用于存储4字节整数?

根据我的理解,malloc(x)返回一个x字节长的内存块。 所以要存储一个4字节的整数,我会这样做: int *p = (int *)malloc(4); *p = 100; 因为sizeof(int)为我返回4。 但是,如果我这样做: int *p = (int *)malloc(1); *p = 100; 它似乎工作完全相同,没有存储值的问题。 为什么malloc()请求的内存量似乎不重要? 4字节整数不应该需要malloc(4)吗?