Tag: 记忆

对于循环停止无缘无故

所以我正在尝试制作一个程序来读取ppm文件并将其存储在内存中,我已经完成了一切颜色,这个function给了我一些问题: typedef struct{ int red, green, blue; } COLOR; COLOR * getNextColor(FILE *fd); COLOR **getColors(FILE *fd, int width, int height){ printf(“\nentered get colors”); COLOR **colors = malloc(sizeof(COLOR*)*height); printf(“\nallocated %d space height”,height); int i,j; for(i = 0; i < height; i++, colors++){ *colors = malloc(sizeof(COLOR)*width); printf("\nallocated %d space width",width); for(j = 0; j < width; j++, […]

CUDA:使用网格划分循环减少共享内存

关于在CUDA内核中共享内存中网格跨越循环和优化缩减算法的使用,我有以下问题。 想象一下,你有1D数组,其元素数多于网格中的线程数(BLOCK_SIZE * GRID_SIZE)。 在这种情况下,您将编写此类内核: #define BLOCK_SIZE (8) #define GRID_SIZE (8) #define N (2000) // … __global__ void gridStridedLoop_kernel(double *global_1D_array) { int idx = threadIdx.x + blockIdx.x * blockDim.x; int i; // N is a total number of elements in the global_1D_array array for (i = idx; i < N; i += blockDim.x * gridDim.x) […]

通常的做法是将重新分配的内存设置为0吗?

在一本C书中,我在一个示例中找到了实现动态resize数组的代码(简化): void *contents = realloc(array->contents, array->max * sizeof(void *)); array->contents = contents; memset(array->contents + old_max, 0, array->expand_rate + 1); 资料来源: 学习C艰难之路 – 第34章 我对memset在这里应该实现的内容感到有些惊讶,但后来我才知道它是为了“重新分配”重新分配的内存而使用的。 我用Google搜索,以便找出,如果这是我应该在realloc之后做的事情,并找到了关于此的stackoverflow答案: 可能没有必要做memset […] 但是,即使你想“将其归零所以一切都很好”,或者真的需要新的指针为NULL :C标准并不保证all-bits-zero是空指针常量(即NULL ) ,所以memset()无论如何都不是正确的解决方案。 来源: 如何在realloc之后将新内存清零 然后建议的解决方案而不是memset使用for循环以便将内存设置为NULL 。 所以我的问题是,因为memset并不一定意味着将值设置为NULL并且for循环解决方案看起来有点单调乏味 – 是否真的需要设置新分配的内存?

将堆栈指针与ARM组件中的4字节对齐8字节

如何将堆栈指针对齐到8字节,现在在ARM中对齐4字节。根据我的理解,如果堆栈指针指向某个地址(如0x4,0x8,0x12和0x16等),则堆栈指针为4字节对齐。 因此,将堆栈指针与8字节对齐意味着它应指向0x8,0x16,0x24和0x32等地址,依此类推。 现在我如何将4字节堆栈指针与8字节对齐指针对齐?

将指针传递给函数时为什么会出现2个星

花了很长时间才使这个代码工作,有人可以向我解释为什么我需要2个星,当我将指针传递给字符串作为函数的参数时? 根据定义,指针将地址保存到将放置特定变量的存储器中。 所以它是一个变量,它有自己的地址,在这个地址下是另一个变量的地址。 好的。 因此,如果我将指针传递给函数,我会使用&符号,因为我必须将指针地址传递给函数。 精细。 但接下来会发生什么。 该函数接收存储器中该指针所在的信息。 好的。 这就是我的理解。 我不明白的是为什么我在定义函数及其参数时需要两颗星。 我传递一个指向char变量的指针。 为什么不取消wpisuj(char * w)。 为什么wpisuj(char ** w)。 内存分配对我来说是不可理解的 – 我使用malloc保留内存,malloc返回此内存的地址,因此我将此地址作为变量w的值。 然后再一些我不明白的东西,如果* w是指针并将新创建的位置的地址保存在内存中,为什么我使用* w来放置一个字符串。 它应该不是*(* w)吗? 由于* w是保留存储器的地址,因此*(* w)是该存储器的内容。 加起来。 我不明白的是:1)为什么wpisuj(char ** w)而不是wpisuj(char * w)2)为什么strcpy( w,bufor)而不是strcpy( (* w),bufor) #include #include #include # define SIZE 256 void wpisuj(char** pw){ char bufor[256]; scanf(“%s”, bufor); int l; l=strlen(bufor)+1; […]

如何知道C函数是否正常工作?

我看到以下代码的结果存在一些差异: #include #include #include int main(void) { char* ptr; ptr = (char*)malloc(sizeof(char) * 12); strcpy(ptr, “Hello World”); printf(“%s\n”, ptr); printf(“FREEING ?\n”); free(ptr); printf(“%s\n”, ptr); } 让我解释: 在根据操作系统对printf的第三次调用中,我获得了不同的结果,在Windows中使用了gargabge caracters,在Linux和Unix系统中没有打印“Hello World”。 有没有办法检查指针的状态,以了解何时释放内存? 我认为这种印刷机制一直不可信。 Thnaks。 问候。

关于C语言中free()的问题

可能重复: free和malloc如何在C中工作? free如何知道在程序中调用时要释放多少字节的内存?

如何使LeakSanitizer忽略程序泄漏的结束

我想使用LeakSanitizer来检测泄漏的内存,但我使用的程序的样式在exit之前不会释放内存。 这在我的经历中相当普遍。 我想检测这个泄漏: int main(int argc, char const *argv[]) { char *p = malloc(5); p = 0; return 0; } 并忽略这个泄漏: int main(int argc, char const *argv[]) { char *p = malloc(5); return 0; }

常量局部变量数组在内存中用于’C’程序

我正在使用GCC 4.8.1,它似乎没有将const变量本地存储在DATA段中的main。 下面是3个这样的程序的代码和内存映射: 代码1: int main(void) { //char a[10]=”HELLO”; //1 //const char a[10] = “HELLO”; //2 return 0; } MEMORY MAP FOR ABOVE: text data bss dec hex filename 7264 1688 1040 9992 2708 a.exe 代码2: int main(void) { char a[10]=”HELLO”; //const char a[10] = “HELLO”; return 0; } MEMORY MAP FOR 2: text data […]

cuda – 零拷贝内存,内存映射文件

我正在尝试创建一个包含uint32_t的映射内存文件,然后将其用作零拷贝固定内存,如下面针对CUDA所示。 我在获取设备指针时获得了cudaErrorInvalidValue ,具有已分配空间并从文件映射内存。 我知道错误消息(来自API)意味着: 这表明传递给API调用的一个或多个参数不在可接受的值范围内。 但我正在努力弄清楚为什么我遇到这个问题……有什么想法吗? 提前致谢。 #include #include #include #include #include #include … int main(void) { struct stat buf; … uint32_t *data, *dev_data; cudaDeviceProp cuda_prop; cudaGetDeviceProperties(&cuda_prop, 0); if (!cuda_prop.canMapHostMemory) exit(EXIT_FAILURE); cudaSetDeviceFlags(cudaDeviceMapHost); int data_file = open(data_file_name, O_RDONLY); int stat = fstat(sa_file, &buf); int data_file_size = buf.st_size; err = cudaHostAlloc((void**)&data, data_file_size, cudaHostAllocMapped); if (err == cudaErrorMemoryAllocation) […]