Tag: 内存

malloc分配的指针大小

char* pointer; pointer = malloc (20000); printf(“%d”, sizeof(pointer)); //output: 8 因为我使用malloc预留了20000个字节,所以我期待输出20000。 但是,它返回8.为什么会发生这种情况?

如何在C程序中删除此分段错误

这里我想解决此代码中的堆栈溢出问题。 在这个代码中,我递归调用函数p 350000次,所以当我删除350000时,我得到分段错误并且放置300000比它工作正常这里分段错误来自因为我更多次调用函数p的递归调用或者调用递归函数太深。 这不起作用,因为我采取if(i != 350000) 。 它的停留时间可能在300000到327480之间。我测试了10次 码: #include void p(char *, int); int main() { char *a = “HI”; int b = 10; p(a, b); printf(“\nComplete”); return 0; } void p(char *a, int b) { static long int i = 0; if (i != 350000) { printf(“\n%ld \t at Hi hello”, i); i++; […]

如何创建一个快速和巨大的联合数组而不浪费C中的内存?

我想使用union将不同的数据类型存储在同一个内存中。 该arrays具有固定长度,应快速访问,并尽可能少浪费内存。 我将定义存储相同数据类型的区域。 所以我这样做: #include #include #include #include #define RESERVED_BYTES 1073741824 //#define RESERVED_BYTES 2147483648 typedef union { char c[RESERVED_BYTES]; //1Byte uint8_t u8[RESERVED_BYTES]; //1Byte uint16_t u16[RESERVED_BYTES / 2]; //2Byte } array_type; int main(void) { array_type *array; array = calloc(1, sizeof(array_type)); getchar(); return 0; } 这段代码工作并分配1GB内存,该数组的元素可以与array[0].u8[3]例如我知道我必须处理索引,因为它们依赖于字节大小。 遗憾的是,如果我增加内存大小(参见#define RESERVED_BYTES 2147483648 )并且在64位计算机上使用MSVS 2013,则代码无法编译我收到error C2148: total size of array must […]

opencl映射内存不起作用

我尝试在我的OpenCL程序中实现内存映射技术,但它不起作用! 这是我的内核代码: __kernel void update(__global char *in, __global char *out) { size_t i; for (i = 0; i < 10; i++); out[i] += 'A' – 'a'; } 这是主机代码: cl_platform_id platformId = NULL; cl_device_id deviceId = NULL; cl_context context = NULL; cl_command_queue commandQueue = NULL; cl_mem cmPinnedBufIn = NULL; cl_mem cmPinnedBufOut = NULL; cl_mem cmDevBufIn = […]

多个进程或库副本之间的C字符串文字存储

当您运行特定程序或库的多个副本时,各种系统的行为是什么,字符串文字是在RAM中存储一次还是对于进程/库的每个副本存储一次? 如果它们存储在如下数组中,该怎么办? static const char *const foo[] = { “bar”, “baz”, “buz” }; static是否会改变内存存储的行为? 编辑:由于它可能是特定于平台的,因此Windows上的Microsoft编译器或Linux上的GCC(x86)上的行为是什么?

局部变长数组

在C ++中的一些代码重构期间,我遇到了以下局部变量长度数组 void some_function(uint8_t length, uint8_t id, uint8_t * bytes)) { uint8_t string[length + 8]; //some transformation on string [1-8] elements do_something(string); } 我不熟悉C99,但是使用可变长度数组大小[x + y]看起来像将放在堆中。 此外,我调试此函数,以确保此“字符串”变量放在堆上,它是。 在C中,局部变量不能是固定大小,因此在使用它们之后不需要清理它们。 但是这里我们有固定大小的数组而没有内存分配,所以不需要在这个变量之后清理,但是GCC编译器如何管理这个内存? 或者也许以其他方式澄清我在这里考虑的内容:长度变量来自外部IO所以在我看来可能存在安全问题(例如当长度为INTEGER_MAX值时),除了检查长度大小还有其他什么行动可以这里有安全代码吗? 或者它可能已经安全了?

在C中使用a_list结构(共享内存中的链表)实现共享内存段

我需要创建一个共享内存段,使用我创建的结构来保存节点 struct a_list { //The head of the list that acts as a node, this list has a next* and a prev* struct list_head list; unsigned long* val; char* str; char state; }; 我尝试在堆栈上查找答案,但他们实现了一个Node而不是我的struct,这是一个包含节点的列表 我也有这个缓冲区和追加方法,我曾经附加到这个列表(使用malloc),但我知道对于共享内存我不能这样做 struct buffer { struct a_list* buffer[BUFFER_SIZE]; int in; int out; }; //Method to append a file to the end of […]

为什么必须为realloc分配指针而不改变内存块中的第一个值?

int *ptr; … realloc(ptr,++count*sizeof(int)); or ptr=realloc(ptr,++count*sizeof(int)); 我注意到如果我不止一次使用第一个选项,第一个内存地址( ptr指向)的值变为未定义(尽管内存块中的所有其他值都很好,可以通过下标ptr访问)。 但是,我假设所有realloc都是缩小或增加内存块的大小,而ptr仍然指向相同的内存块,它的值都不会改变。 因此,如果我使用第一个选项,为什么内存块中的第一个地址最终会出现意外值,因为ptr仍然指向同一个地址? EDIT:我确实记得为ptr分配内存,只是没想到它的工作提到。

虚拟内存或物理内存

假设我们用C编写程序并打印程序中声明的变量之一的地址,是在屏幕上打印虚拟地址或变量的物理地址的地址? 如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围? 例如。 对于32位机器,如果它返回0x833CA23E。

我的程序输出没有在C中更新

我有下面的c代码,它工作正常一次,再次调用该函数后,它给出了相同的结果。 缓冲区未更新。 #define _XOPEN_SOURCE #include #include #include #include char *EpochToMMDDYYYY(long ); int main() { long epoch = 1492151737; printf(“date of %ld is %s\n”,epoch,EpochToMMDDYYYY(epoch)); long ep = 1492222737; printf(“date of %ld is %s\n”,epoch,EpochToMMDDYYYY(ep)); long epc = 1491111737; printf(“date of %ld is %s\n”,epoch,EpochToMMDDYYYY(epc)); return 0; } char *EpochToMMDDYYYY(long ep) { struct tm tm; char b[25]; memset(b,0,sizeof(b)); //setenv(“TZ”, […]