Tag: 内存

用const char指针分配的内存在哪里?

可能重复: 是在静态内存中创建的c ++中的字符串文字吗? C ++字符串文字数据类型存储 在这段代码中: const char * str = “hello world”; 如果我理解正确,指针是4或8个字节,我想这将在堆栈上分配。 但分配和存储“hello world”的内存在哪里? 或者str指向什么?

堆栈内存使用算术和递归函数调用

我关心的是在涉及算术和递归函数调用的指令中将使用堆栈内存,例如: return 5 + f(a-1); //f is recursive 我想了解什么放在堆栈上,什么时候,以便我知道在深度递归的情况下什么可能或不可能导致内存问题。 这是一个更完整的例子: int f(int a) { if (a > 0) { return 5 + f(a-1); } else { return 0; } } 让我们关注线路return 5 + f(a-1); 在这一点上我们将在内存中存储什么? 我们在堆栈中有一个整数a的位置,因为变量是f的本地变量 是否会存储值5和1? 操作a-1的结果怎么样,它会被放到堆栈上? f的返回值怎么样? 关于所使用的内存量的“最坏情况”场景将是在某些时候所有这些将同时在堆栈上。 更好的情况是,将按顺序分配和解除分配,以便不是所有内容都保存在内存中。 怎么会发生? 是由编译器决定的吗? 非常感谢,

如何在c函数中动态malloc内存?

我想调用这样的函数: char* Seg(char* input, char **segs, int* tags) 实际上input是真正的输入, segs tags是返回,现在返回是错误消息。 我的程序是这样的: #include char* Seg(char* input, char **segs, int* tags) { // dynamic malloc the memory here int count = strlen(input); // this count is according to input for (int i = 0; i < count; i++) { segs[i] = "abc"; } for (int i […]

应该何时使用动态内存分配函数与直接变量声明?

以下是直接变量声明的示例。 double multiplyByTwo (double input) { double twice = input * 2.0; return twice; } 下面是动态内存分配的示例。 double *multiplyByTwo (double *input) { double *twice = malloc(sizeof(double)); *twice = *input * 2.0; return twice; } 如果我有一个选择,我会一直使用直接变量声明,因为代码看起来更具可读性。 什么时候动态内存分配更合适?

在共享内存中保留固定大小的符号

我一直在研究一些需要我存储符号列表和相应计数的东西,它们被存储为字符串,int映射。 问题是输入大小约为32 MB但是当我尝试将其存储在内存中时,大小膨胀到1.4Gb,我经历了一些链接,发现std :: string占用了相当多的内存用于簿记和很可能导致膨胀,所以我进一步看了一下,发现可以使用boost :: array,其大小等于符号的最大大小,因为boost数组不做任何书籍保持它没有导致记忆臃肿。 但是,我希望将这个boost数组放在共享内存中,就像map<boost::array ,int>。我看了一下boost :: array文档,发现它不支持allocators ,目前我使用boost的分配器和段管理器如下: typedef bip::allocator CharAllocator; typedef bip::basic_string<char, std::char_traits, CharAllocator> SharedString; 我也遇到了这个链接,这似乎解释了很多: http : //jovislab.com/blog/?p = 89 有没有办法做到这一点,我有什么其他选择。 我不是在寻找完整的解决方案,而是提示。 谢谢,Deb!

结构数组内存realloc stderr

当我将元素放入其中时,我试图重新分配一个结构数组,因为我将元素放入其中但我仍然收到一个realloc stderr。 struct数组最终将包含235,000个元素。 当我将初始起始大小设置为100,000时,我在尝试重新分配时收到stderr。 如果我将初始起始大小设置为300,000,则不会给出错误,因为它永远不会到达realloc语句。 #define _XOPEN_SOURCE #include #include #include #include #define BUFFERLEN 200 #define START_SIZE 100000 #define GROW 1000 #define TRUE 1 #define FALSE 0 typedef struct{ char *forw; char *back; } word; typedef struct{ char *entry; } single_words; FILE *words; /*————-Function Prototypes————*/ void reverse(char* string, char* revstr, int len); int search_struct(char* find, word* […]

这种mlockall的用法是否正确?

下面的程序XORs 2文件使用一次填充加密创建输出文件。 我试图使用mlockall ,以避免从外部内存源获取密钥文件时硬盘上留下任何密钥文件的痕迹。 从mlockall手册页: mlock() and mlockall() respectively lock part or all of the calling process’s virtual address space into RAM, preventing that memory from being paged to the swap area. 我如何检查它是否正常工作并且我正确使用了mlockall ? #include #include #include #include int main(int argc, char **argv) { struct stat statbuf; struct stat keybuf; char buffer [20]; int key; […]

结构内存分配,内存分配应为4的倍数

struct x { char b; short s; char bb; }; int main() { printf(“%d”,sizeof(struct x)); } 输出为:6 我在32位编译器上运行此代码。 输出应为8个字节。 我的解释 – > 1. Char需要1个字节,下一个short需要2的倍数,所以short创建1的填充并占用2个字节,这里已经分配了4个字节。 现在唯一的左边的char成员占用1个字节,但是因为内存分配是4的倍数,所以总内存给出的是8个字节。

c中字符串的动态内存分配

我发现这段代码完美无缺。 #include #include int main(int argc,char *argv[]) { char* s; /* input string */ s=malloc(sizeof(s)); int c; if(argc==1){ // if file name not given while (gets(s)){ puts(s); } } } 我不明白的是,字符串是如何存储在内存中的。我只为指针s分配内存,指针是4个字节。现在用户给出的输入字符串存储在哪里?

C – 被释放的指针未被分配

我试图释放我从malloc()分配的向量中分配的指针,当我尝试删除第一个元素(index [0])时,它工作,当我尝试删除第二个(index [1])我收到此错误: malloc: *** error for object 0x100200218: pointer being freed was not allocated 代码: table->t = malloc (sizeof (entry) * tam); entry * elem = &table->t[1]; free(elem);