Tag: malloc

为什么malloc(sizeof(指针))有效?

以下代码工作正常: #include #include int main() { struct node{ int a, b, c, d, e; }; struct node *ptr = NULL; printf(“Size of pointer ptr is %lu bytes\n”,sizeof (ptr)); printf(“Size of struct node is %lu bytes\n”,sizeof (struct node)); ptr = (struct node*)malloc(sizeof (ptr)); //Line 1 // ptr = (struct node*)malloc(sizeof (struct node)); //Line 2 ptr->a = […]

如何在C中用malloc初始化静态指针?

我正在尝试在C中使用malloc启动静态变量(在函数内部),但我得到的是“初始化程序不是常量错误”。 我知道我不能在C中使用非常量启动静态,但是有人能想到解决方案吗? 我需要代码具有与此相同的效果: static int *p = (int *)malloc(sizeof(int)); 有诀窍/解决方法吗? 编辑:我有一个函数,每次标志变高时调用。 在这个函数中,我正在创建并启动一个新线程。 我声明了一个指向结构的指针,并使用malloc分配内存,然后将此指针传递给线程。 然后该函数返回控制。 当我重新进入函数时,我最初打开的线程仍将运行,我希望能够访问我最初传递给线程的内存区域。 这就是为什么我需要一个静态,以便我可以在第一次调用时使用malloc,然后在后续调用中使用相同的地址。 这样我就可以从线程中获取信息。 这一切都是为了避免使用全局变量。

为什么malloc(0)在Windows中返回非空地址?

下面的代码在Windows中执行时返回一个地址,虽然我希望它返回NULL。 int main() { char *ptr = NULL; ptr = malloc(0); printf(“malloc returned = %u\n”, ptr); } 什么可能促使malloc的这种实现? 它背后有什么理由吗? 因为,这是一个0字节的内存,我没有尝试写任何数据。 但是,这个记忆可以用于任何东西吗?

malloc的最佳实践是什么?

如果以下任何一项是正确的,并且被认为是创建一个能够容纳100个字符的字符串的最佳做法? char * charStringA = malloc(100); char * charStringB = malloc(sizeof(char)*100); char * charStringC = (char*)malloc(100); char * charStringD = (char*)malloc(sizeof(char)*100);

为什么malloc分配的字节数与请求的数量不同?

我有这段代码 #include #include #include #include int main(){ void *a, *b; a = malloc(16); b = malloc(16); printf(“\n block size (for a): %p-%p : %li”, b, a, ba); a = malloc(1024); b = malloc(1024); printf(“\n block size (for a): %p-%p : %li”, b, a, ba); } 这不应该打印最后分配的块大小(16或1024)? 它反而打印24和1032,因此分配的内存量似乎有8个额外的字节。 我的问题是(在进行这个测试用例之前)我在一个函数(1024字节)中执行malloc() ),并返回分配的结果。 在函数返回时检查块大小时,我得到了516个块……我不明白为什么。 我想这可能是在对分配的缓冲区进行一些处理后发生内存损坏的原因:) 编辑:我已经看过如何从C中的指针获取数组的大小? 似乎问了同样的事情,抱歉重新发布。 我已将我的示例重新编写为更具体的代码: #include […]

Malloc函数(动态内存分配)在全局使用时导致错误

#include #include char *y; y=(char *)malloc(40); // gives an error here int main() { strcpy(y,”hello world”); } error: conflicting types for ‘y’ error: previous declaration of ‘y’ was here warning: initialization makes integer from pointer without a cast error: initializer element is not constant warning: data definition has no type or storage class warning: passing […]

C – 初始化结构数组

我在初始化结构数组时遇到问题。 我不确定我是否做得对,因为我得到“从不兼容的指针类型初始化”和“从不兼容的指针类型分配”。 我在代码中添加了这些警告,当我尝试从结构中打印数据时,我只是得到垃圾,例如@@ ### typedef struct { char* firstName; char* lastName; int day; int month; int year; }student; //初始化数组 student** students = malloc(sizeof(student)); int x; for(x = 0; x < numStudents; x++) { //here I get: "assignment from incompatible pointer type" students[x] = (struct student*)malloc(sizeof(student)); } int arrayIndex = 0; //添加struct //create student struct //here […]

当我们用负参数调用Malloc时会发生什么?

7.22.3.4 malloc函数malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的。 原型: void *malloc(size_t size); 我尝试将负值作为参数传递: malloc(negative)返回NULL 。 是因为[size_t]否定转换为无符号[某个大值]并且无法分配所需的空间或者是函数检查参数并返回NULL ? 如果它转换为大正值,那么当调用malloc(INT_MIN+2)它仍然返回NULL ,但是malloc(0)分配给指针并且*p = somevalue有效。 那这个呢? 它是实现定义的吗? 阅读此链接: malloc(0)

从错误返回后释放内存的最佳方法是什么?

假设我有一个为调用者分配内存的函数: int func(void **mem1, void **mem2) { *mem1 = malloc(SIZE); if (!*mem1) return 1; *mem2 = malloc(SIZE); if (!*mem2) { /* … */ return 1; } return 0; } 在第二个malloc()失败的情况下,我想听听你对free()分配内存的最佳方法的反馈。 你可以想象一个更复杂的情况,有更多的错误退出点和更多的分配内存。

在混合C / C ++程序中调整malloc和new的“正确”方法是什么?

我有一个混合的C / C ++程序。 它包含一个以C / C为目标的flex / bison解析器,其余为C ++。 作为C,生成的解析器和扫描程序使用malloc , realloc和free管理它们的内存。 它们足以暴露钩子,允许我提交我自己的这些函数的实现。 正如您所料,(C ++)程序的其余部分“希望”使用new , delete等。 做一点研究似乎表明相关标准并不能保证这种混合应该起作用。 特别是C“堆”不一定是C ++“自由区”。 看来这两个方案可以互相践踏。 最重要的是,有一天(很快),该程序可能希望集成一个自定义的堆实现,例如tcmalloc ,由C和C ++使用。 在这里做什么是“正确”的事情? 鉴于需要集成tcmalloc(它解释了如何与C程序链接),我很想在C ++内存管理中找到一些跨类型,跨线程,跨所有重载/挂钩/任何内容。 有了这个,我可以将所有C ++分配/释放调用指回它们的C等价物(反过来又落在tcmalloc上。) 是否存在这样的泛星系全局C ++钩子? 可能它已经在做我想要的,类似于ios_base::sync_with_stdio默认秘密地与iostream和stdio结合? 我对谈论stdio与iostreams以及切换解析器生成器以及使用C ++ flex / bison骨架(它们引入独立的头痛)并不感兴趣。 编辑 :请包括支持您的答案的C ++标准的那些部分的名称。