Tag: malloc

对齐内存管理?

关于管理对齐的内存块,我有一些相关的问题。 跨平台的答案是理想的。 但是,由于我非常确定不存在跨平台解决方案,因此我主要对Windows和Linux以及(在很大程度上)Mac OS和FreeBSD感兴趣。 在16字节边界上对齐大块内存的最佳方法是什么? (我知道使用malloc()的简单方法,分配一些额外的空间,然后将指针碰到一个正确对齐的值。虽然我希望能找到一些不那么重要的东西。另外,请参阅以下是其他问题。) 如果我使用普通的旧malloc() ,分配额外的空间,然后将指针移动到正确对齐的位置,是否有必要将指针保持在块的开头以便释放? (在指向块中间的指针上调用free()似乎在Windows上实际运行,但我想知道标准是什么,即使标准说你不能,它是否在所有主要的实践中都有效操作系统。我不关心模糊的DS9K操作系统。) 这是一个艰难/有趣的部分 。 在保持对齐的同时重新分配内存块的最佳方法是什么? 理想情况下,这比调用malloc() ,复制,然后在旧块上调用free()更聪明。 我想尽可能在​​适当的地方做。

使用strcpy()和复制C中char *的地址之间的区别

我有两个动态分配的数组。 C char **a = (char**)malloc(sizeof(char*) * 5)); char **b = (char**)malloc(sizeof(char*) * 5)); for (int i = 0; i < 7, i++) { a[i] = (char*)malloc(sizeof(char)*7); b[i] = (char*)malloc(sizeof(char)*7); } 如果a[0]是”hello\0″并且我想将a[0]复制到b[0] , strcpy和指针赋值是否相同? 例如: strcpy(b[0], a[0]) b[0] = a[0] 这些都会做同样的事吗?

C中的动态数组 – 我对malloc和realloc的理解是否正确?

我正在学习如何在C中创建动态1D数组。下面的代码尝试执行以下操作: 使用malloc ,创建一个长度为10的动态数组,它包含double类型的值。 对于j = 0, 1,…, 9 ,将数组的每个条目设置为j/100 。 然后打印出来。 使用realloc在数组末尾添加一个额外的空条目。 将新条目设置为j/100并再次打印出每个条目。 测试: double* data = (double*)malloc(10*sizeof(double)); for (j=0;j<10;j++) { data[j]= ((double)j)/100; printf("%g, ",data[j]); } printf("\n"); data = (double*)realloc(data,11*sizeof(double)); for (j=0;j<11;j++) { if (j == 10){ data[j]= ((double)j)/100; } printf("%g, ",data[j]); } free((void*) data); 问题 我编码正确吗? 教程我发现使用malloc而不将(double*)放在前面。 例如, int *指针; pointer = malloc(2 * […]

对malloc返回的指针进行类型转换是一种更好的做法吗?

对于下面的C代码,比较int指针a和b的定义; #include #include int main() { int *a=malloc(sizeof(int)); int *b=(int *)malloc(sizeof(int)); return(0); } 以任何方式更好地对malloc函数返回的类型为void的指针进行类型转换? 或者在分配到左侧的int指针时是自动类型化的吗? 在哪种情况下,如果有的话,它是否可以certificate是必要的而不仅仅是强制性的? 请说明隐式类型转换,右侧类型转换为左侧类型,是否适用于此处。

为Array of Structs动态分配内存

这是我正在尝试做的事情: #include #include struct myStruct { int myVar; } struct myStruct myBigList = null; void defineMyList(struct myStruct *myArray) { myStruct *myArray = malloc(10 * sizeof(myStruct)); *myArray[0] = ’42’; } int main() { defineMyList(&myBigList); } 我正在写一个简单的C程序来完成这个。 我正在使用GNU99 Xcode 5.0.1编译器。 我已经阅读了很多例子,编译器似乎不同意在哪里使用struct标签。 在sizeof()命令中使用struct引用似乎根本不识别struct 。

将内存分配给双指针?

我无法理解如何为双指针分配内存。 我想读取一个字符串数组并存储它。 char **ptr; fp = fopen(“file.txt”,”r”); ptr = (char**)malloc(sizeof(char*)*50); for(int i=0; i<20; i++) { ptr[i] = (char*)malloc(sizeof(char)*50); fgets(ptr[i],50,fp); } 而不是这个我只是分配一个大的内存块并存储字符串 char **ptr; ptr = (char**)malloc(sizeof(char)*50*50); 那会错吗? 如果是这样,为什么呢?

为什么我们可以在C语言之外写入?

我最近读完了有关虚拟内存的内容,我对于malloc如何在虚拟地址空间和物理内存中工作有疑问。 例如(从另一个SOpost复制的代码) void main(){ int *p; p=malloc(sizeof(int)); p[500]=999999; printf(“p[0]=%d\n”,p[500]); //works just fine. } 为什么允许这种情况发生? 或者为什么p [500]的地址甚至可写? 这是我的猜测。 当调用malloc时,操作系统可能会决定为进程提供整个页面。 我将假设每个页面的空间值为4KB。 整个事情是否被标记为可写? 这就是为什么你可以到500 * sizeof(int)进入页面(假设32位系统,其中int的大小为4字节)。 当我尝试以更大的值编辑时,我看到了… p[500000]=999999; // EXC_BAD_ACCESS according to XCode 段故障。 如果是这样,那么这是否意味着有些页面专用于您的代码/指令/文本段并标记为不可写入与您的堆栈/变量所在的页面完全分离(事情发生变化)并标记为可写? 当然,该过程认为它们位于32位系统上4gb地址空间中的每个订单旁边。

openmp是否会分配内存并释放所有内容

openmp是否分配内存并释放所有内存? 因为我跑了valgrind,并且释放了我所有的名单..我在malloc的所有东西,我都自由了。 ==11442== HEAP SUMMARY: ==11442== in use at exit: 192 bytes in 1 blocks ==11442== total heap usage: 2,001 allocs, 2,000 frees, 2,917,280 bytes allocated ==11442== ==11442== LEAK SUMMARY: ==11442== definitely lost: 0 bytes in 0 blocks ==11442== indirectly lost: 0 bytes in 0 blocks ==11442== possibly lost: 0 bytes in 0 blocks ==11442== […]

查询分配块大小的任何函数?

我意识到任何这样的function都可能是非标准的,但这对我的用例来说没问题。 基本上,我需要一个方法(即使它只通过glibc的syscall()接口公开)我可以传递一个指针(由前一个调用malloc()返回的指针)返回指针块的大小指向。 这样的事情存在吗?

malloc还是普通的数组定义?

什么时候我应该在C中使用malloc而不是普通的数组定义? 我无法理解之间的区别: int a[3]={1,2,3} int array[sizeof(a)/sizeof(int)] 和: array=(int *)malloc(sizeof(int)*sizeof(a));