Tag: 内存管理

为指针及其数据分配的内存在哪里?

我的问题是我是否有一些function void func1(){ char * s = “hello”; char * c; int b; c = (char *) malloc(15); strcpy(c,s); } 我认为s指针是在堆栈上分配的,但是存储的数据“hello”在程序的数据段中是什么? 至于c和b它们是单元化的,因为’c =一些内存地址’而它没有一个但它是如何工作的? 和b也没有内容所以它不能存储在堆栈上? 然后当我们在堆上为c分配内存时,malloc c现在有一些内存地址,如果给定堆上该字符串的第一个字节的地址,这个单元化的c变量怎么样?

在循环中调用realloc的缺点

我试图在Windows 7上用C实现一些数学算法,我需要反复增加我的数组的大小。 有时它会失败,因为realloc无法分配内存。 但是如果我在开始时一次分配大量内存它就可以正常工作。 这是内存管理器的问题吗? 有人能解释一下吗?

提交和锁定虚拟内存有什么区别?

有一些C函数。 例如; VirtualAlloc()保留和提交, VirtualLock()锁定虚拟内存空间的一个区域。 它们之间有什么区别?

编程环境中的虚拟地址空间

我对虚拟地址空间的含义感到困惑。 在32位机器中,进程可以处理2 ^ 32个存储器位置。 这是否意味着每个进程的虚拟地址空间是2 ^ 32(4GB)? 以下是进程的虚拟地址空间的快照。 这可以增长到4GB吗? 这种系统中的进程数量是否有限制?

结构成员对齐中的混乱

typedef struct structc_tag { char c; double d; int s; } structc_t; 我在博客中读到这将占用24个字节的数据: sizeof(char)+ 7字节填充+ sizeof(double)+ sizeof(int)+ 4字节填充= 1 + 7 + 8 + 4 + 4 = 24字节。 我的问题是为什么7字节填充,为什么我们不能在那里使用3字节填充并使用接下来的8字节为double? 最后4个字节需要什么?

如何在C / C ++中释放数组

int main() { // Will this code cause memory leak? // Do I need to call the free operator? // Do I need to call delete? int arr[3] = {2, 2, 3}; return 0; } 这段代码是否会造成内存泄漏? arr在哪里居住? 在堆栈或RAM中?

C会自动释放没有指针的内存吗?

假设我们单独运行这段代码: malloc(1024); 这会导致内存泄漏,还是C会自动知道释放没有引用的指针? 换句话说,我可以避免将其分配给指针吗? void *p = malloc(1024); free(p);

重新分配数组(C99)

该标准指定如果新大小(如果更大),则重新分配空间的内容是未定义的。 如果保留先前分配的空间的内容很重要,那么重新分配数据的最佳方法如下:将其复制到堆栈,从堆中释放它,在堆上分配更多空间,然后复制回堆? 还有另一种安全的方法吗? 实现数据结构的最佳方法是像动态增长的数组一样只能以链表的forms增长吗?

为什么此代码中的缓冲区溢出与我的预期不同?

我有这个程序: #include #include #include void main(void) { char *buffer1 = malloc(sizeof(char)); char *buffer2 = malloc(sizeof(char)); strcpy(buffer2, “AA”); printf(“before: buffer1 %s\n”, buffer1); printf(“before: buffer2 %s\n”, buffer2); printf(“address, buffer1 %p\n”, &buffer1); printf(“address, buffer2 %p\n”, &buffer2); strcpy(buffer1, “BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB”); printf(“after: buffer1 %s\n”, buffer1); printf(“after: buffer2 %s\n”, buffer2); } 哪个印刷品: before: buffer1 before: buffer2 AA address, buffer1 0x7ffc700460d8 address, buffer2 […]

数组和指向字符串文字的指针之间的区别

我是C的新手,所以这可能是一个愚蠢的问题。 我正在编写一段代码如下: char ar[]=”test”; *(ar+1)=’r’; 这工作正常。 但无论何时我这样做: char *p=”test”; *(p+1)=”r”; 这是分段错误 。 任何人都可以描述为什么第二种情况会给出分段错误? 从记忆的角度来解释将不胜感激。