Tag: 内存

指针的大小是多少? 它究竟依赖于什么?

我在网上搜索,虽然我可以找到一些讨论,但我没有找到全面的描述。 因此,如果任何人都可以形成一个涵盖指针大小的答案,那将会有很大的帮助。 答案至少应包括以下主题 指针的大小取决于什么? 架构的哪些特性会影响指针的大小? (详细地) 编译器如何影响指针的大小?

如何确定返回的指针是否在堆栈或堆上

我有一个插件架构,我在动态库中调用函数,他们返回一个char* ,这是答案,它在稍后阶段使用。 这是插件函数的签名: char* execute(ALLOCATION_BEHAVIOR* free_returned_value, unsigned int* length); 其中ALLOCATION_BEHAVIOR必须是: DO_NOT_FREE_ME , FREE_ME , DELETE_ME ,其中插件(在库中)告诉我插件如何分配它刚刚返回的字符串: DO_NOT_FREE_ME告诉我,这是一个我不应该触摸的变量(例如一个永远不会改变的const static char* FREE_ME告诉我应该使用free()来释放返回的值, DELETE_ME告诉我使用delete[]来消除内存泄漏。 显然,我不相信插件,所以我希望能够检查一下,如果他告诉我free()变量,确实它是真正可以释放的东西……这是否可能使用今天的C Linux / Windows上的/ C ++技术?

为什么编译器在堆栈中分配的数量超过了需要?

我有一个简单的C程序。 比方说,我有一个长度为20的int和一个char数组。我总共需要24个字节。 int main() { char buffer[20]; int x = 0; buffer[0] = ‘a’; buffer[19] = ‘a’; } 堆栈需要与16字节边界对齐,因此我假设编译器将保留32个字节。 但是当我使用gcc x86-64编译这样的程序并读取输出程序集时,编译器会保留64个字节。 ..\gcc -S -o main.s main.c 给我: .file “main.c” .def __main; .scl 2; .type 32; .endef .text .globl main .def main; .scl 2; .type 32; .endef .seh_proc main main: pushq %rbp # RBP is pushed, […]

char数组中可以有多少个字符?

#define HUGE_NUMBER ??? char string[HUGE_NUMBER]; do_something_with_the_string(string); 我想知道什么是我可以添加到char数组的最大数量,而不会冒任何潜在的内存问题,缓冲区溢出等风险。 我想让用户输入,也许最大可能。

由于我无法返回局部变量,从C或C ++函数返回字符串的最佳方法是什么?

作为这个问题的后续行动: 从我所看到的,这应该按预期工作: void greet(){ char c[] = “Hello”; greetWith(c); return; } 但这会导致未定义的行为: char *greet(){ char c[] = “Hello”; return c; } 如果我是对的,那么修复第二个问候语function的最佳方法是什么? 在嵌入式环境中? 在桌面上?

如何确定内存是否对齐?

我是使用SSE / SSE2指令优化代码的新手,直到现在我还没有走得太远。 据我所知,常见的SSE优化函数如下所示: void sse_func(const float* const ptr, int len){ if( ptr is aligned ) { for( … ){ // unroll loop by 4 or 2 elements } for( ….){ // handle the rest // (non-optimized code) } } else { for( ….){ // regular C code to handle non-aligned memory } } } […]

2D和3Darrays的动态分配/释放

我知道动态分配/解除分配2D数组的算法,但是对于3D数组我也不太清楚。 利用这些知识和一点对称性,我想出了以下代码。 (我在编码期间很难在3D中进行可视化)。 请评论正确性并建议任何更好的替代方案(效率方面或直观方面),如果有的话。 此外,我认为这些2D和3D数组都可以正常访问,如静态数组,如arr2D [2] [3]和 arr3D [2] [3] [2]。 对? 二维码 //allocate a 2D array int** allocate2D(int rows,int cols) { int **arr2D; int i; arr2D = (int**)malloc(rows*sizeof(int*)); for(i=0;i<rows;i++) { arr2D[i] = (int*)malloc(cols*sizeof(int)); } } //deallocate a 2D array void deallocate2D(int** arr2D,int rows) { int i; for(i=0;i<rows;i++) { free(arr2D[i]); } free(arr2D); } 3D代码 //allocate […]

测量缓存延迟

所以我试图用C测量L1,L2,L3缓存的延迟。我知道它们的大小,我觉得我从概念上理解如何做到这一点,但我遇到了我的实现问题。 我想知道一些其他硬件错综复杂如预取是否会导致问题。 #include #include #include int main(){ srand(time(NULL)); // Seed ONCE const int L1_CACHE_SIZE = 32768/sizeof(int); const int L2_CACHE_SIZE = 262144/sizeof(int); const int L3_CACHE_SIZE = 6587392/sizeof(int); const int NUM_ACCESSES = 1000000; const int SECONDS_PER_NS = 1000000000; int arrayAccess[L1_CACHE_SIZE]; int arrayInvalidateL1[L1_CACHE_SIZE]; int arrayInvalidateL2[L2_CACHE_SIZE]; int arrayInvalidateL3[L3_CACHE_SIZE]; int count=0; int index=0; int i=0; struct timespec startAccess, endAccess; double […]

malloc()/ free()在哪里存储分配的大小和地址?

malloc()和free()在哪里存储分配的地址及其大小(Linux GCC)? 我已经读过一些实现将它们存储在实际分配的内存之前的某个地方,但是在我的测试中我无法确认。 背景,也许有人有另一个提示:我正在尝试分析进程的堆内存,以确定另一个进程中字符串的当前值。 访问进程堆内存并浏览它是没有问题的。 但是,因为字符串的值发生了变化,并且进程每次都会分配内存的新部分,所以字符串的地址会发生变化。 因为字符串有一个固定的格式,它仍然很容易找到,但经过一些更改后,旧版本的字符串仍然在堆内存中(可能已释放,但仍未被重用/覆盖),因此我无法分辨哪个字符串是当前字符串。 因此,为了仍然找到当前的一个,我想检查我在内存中找到的字符串是否仍然使用,通过比较其地址与malloc / free知道的地址。 ciao,Elmar

为什么在C中释放struct还有数据?

当我运行此代码时: #include typedef struct _Food { char name [128]; } Food; int main (int argc, char **argv) { Food *food; food = (Food*) malloc (sizeof (Food)); snprintf (food->name, 128, “%s”, “Corn”); free (food); printf (“%d\n”, sizeof *food); printf (“%s\n”, food->name); } 我还是得到了 128 Corn 虽然我已经解放了食物。 为什么是这样? 记忆真的被释放了吗?