Tag: 内存

C – 共享内存 – 共享结构中的动态数组

我正在尝试分享这样的结构 例: typedef struct { int* a; int b; int c; } ex; 在进程之间,问题是当我使用malloc初始化’a’时,它变为私有的进程堆执行此操作(或者至少我认为这是发生的事情)。 有没有办法用这个有效的结构创建共享内存(使用shmget,shmat)? 编辑:我正在研究Linux。 编辑:我有一个初始化缓冲区的进程,如下所示: key_t key = ftok(“gr”, ‘p’); int mid = shmget(key, sizeof(ex), IPC_CREAT | 0666); ex* e = NULL; status b_status = init(&e, 8); //init gives initial values to bc and allocate space for ‘a’ with a malloc e = […]

如何将不同类型存储在内存中

我目前正在编写一个涉及处理字节的C程序。 说到字节,我真的很担心以下问题。 字符是否由ascii代码存储在内存中? 说’A’有anscii代码65.所以它以与整数65相同的方式存储在内存中? 如果是这样,机器如何区分字符和整数? 如果字符由ascii代码存储,则ascii代码是整数。 一个整数应占用至少2个字节,一个字符怎么只占用1个字节? 最后一个是关于不同体系结构的整数。 在16位机器上,如果1存储为000 … 0001,那么在32位机器上,1仍然以相同的方式存储,只需在前面添加0?

可以通过编译器删除`memset`函数调用吗?

我在这里读到,如果编译器知道传递的内存缓冲区从未再次使用过 ,则可以自由删除对memset调用。 怎么可能? 在我看来(从核心语言的角度来看) memset只是一个常规函数,编译器没有权利假设它内部发生的任何事情都没有副作用。 在链接文章中,他们展示了Visual C ++ 10如何删除memset 。 我知道Microsoft编译器在标准合规性方面并不领先,所以我问 – 它是按照标准,还是仅仅是msvc-ism? 如果符合标准,请详细说明;) 编辑: @Cubbi 以下代码: void testIt(){ char foo[1234]; for (int i=0; i<1233; i++){ foo[i] = rand()%('Z'-'A'+1)+'A'; } foo[1233]=0; printf(foo); memset(foo, 0, 1234); } 在mingw下用线编译: g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -o main.o main.cpp g++ -Wl,-s -Wl,-subsystem,console -mthreads -o main.exe main.o […]

如何获取字符串的第n个字符?

我有一个字符串, char* str = “HELLO” 如果我想从中获得E ,我该怎么做?

在C中释放()malloc的二维数组的最佳方法

假设我有一个用这样的东西创建的二维数组, char **foo = (char **) malloc(height * sizeof(char *)); for(i = 0; i <= height; i++) foo[i] = (char *) malloc (width * sizeof(char *)); 首先,这甚至是创建像这样的数组的正确方法吗? 这里的问题是,’height’和’width’是在运行时设置的东西。 这似乎有效,但这是释放这个2Darrays的最佳策略。 免费(funge)听起来不对。 通过这里的其他post,我想我会逐一释放每一行? 我确实试过这样的事, for (height = 0; height funge_height; height++) { free(funge[height]); } free(funge) 然而,这给了我一个双重自由指针exception。 这是不是意味着,我不需要管理这段记忆? 我的印象是,对于每个malloc的内存,我们应该调用free()。

复制内存中的函数并执行它

我想知道在C中如何将一个函数的内容复制到memroy并执行它? 我正在尝试做这样的事情: typedef void(*FUN)(int *); char * myNewFunc; char *allocExecutablePages (int pages) { template = (char *) valloc (getpagesize () * pages); if (mprotect (template, getpagesize (), PROT_READ|PROT_EXEC|PROT_WRITE) == -1) { perror (“mprotect”); } } void f1 (int *v) { *v = 10; } // allocate enough spcae but how much ?? myNewFunc = allocExecutablePages(…) […]

在程序结束后没有释放的内存会发生什么?

重复 : 当你在malloc之后没有释放时真正发生了什么? 比方说,例如: int main() { char* test = new char[50000]; return 0; } 程序完成后分配的内存会发生什么变化? 是否立即获得其他应用程序的释放? 或者也许过了一段时间? 或许它永远丢失在系统中? 或者它是否被交换到磁盘永远不会返回到RAM? 或者也许完全不同的东西? 我想知道主要3操作系统会发生什么:Windows(XP及以上,如果有任何差异),Linux,Mac OS X.

什么是数据对齐? 当在C中进行类型转换指针时,为什么以及何时应该担心?

我找不到一个体面的文档来解释对齐系统如何工作以及为什么某些类型比其他类型更严格一致。

从函数创建并返回一个大对象

想象一下这种情况,我有这样的function: Object f() { Object obj; return obj; } 其中sizeof(Object)是一个很大的值。 然后我打电话给这个函数: Object object = f(); 我是否正确理解第一个Object将在堆栈上创建(在函数中)然后将被复制到对象变量? 如果是这样,是否合理地在堆上的函数中创建一个对象并返回指向它而不是副本的指针? 但我的意思是必须在f()函数中创建对象 – 不是通过指针或对此函数的引用传递并初始化。 编辑 我并不是说f是一个非常简单的function。 根据某些上下文,它可能有一个非常复杂的对象初始化例程。 编译器是否仍会优化它?

从错误返回后释放内存的最佳方法是什么?

假设我有一个为调用者分配内存的函数: int func(void **mem1, void **mem2) { *mem1 = malloc(SIZE); if (!*mem1) return 1; *mem2 = malloc(SIZE); if (!*mem2) { /* … */ return 1; } return 0; } 在第二个malloc()失败的情况下,我想听听你对free()分配内存的最佳方法的反馈。 你可以想象一个更复杂的情况,有更多的错误退出点和更多的分配内存。