malloc 相关问题

malloc函数在C中执行动态内存分配,是标准库的一部分。有关malloc的用法,行为和实现的问题,请使用此标记。

“malloc_trim(0)”的真正含义是什么?

手册页告诉了我很多,通过它我了解了很多“glibc”内存管理的背景知识。 但我还是很困惑。执行“malloc_trim(0)”(注意零...

回答 2 投票 0

在 C 中,memcpy() 不需要/不建议强制转换为 (void*),就像 malloc() 不需要一样?

我对从以下网站读到的有关 memcpy()(和 malloc())的内容感到有些困惑: http://www.cplusplus.com/reference/cstring/memcpy/ 在该页面中,以下两行显然是...

回答 3 投票 0

是否应该避免强制执行一次 malloc 调用的内存分配实践?

我想知道为与结构相关的所有数据分配内存是否是一个好的做法。因此,假设我们有以下结构,其目的是存储浮点数组的数组: #包括 我想知道为与结构相关的所有数据分配内存是否是一个好的做法。因此,假设我们有以下结构,其目的是存储浮点数组的数组: #include <stdlib.h> typedef struct Arrays { int n; int* l; double** data; } Arrays; 可以像这样初始化一个示例: Arrays* UsualInitialization(int n) { // Constructs an array A of length n containing the arrays A[i] = [1,2,...,i] Arrays* A = (Arrays*) malloc(sizeof(Arrays*)); A->n = n; A->l = (int*) malloc(n * sizeof(int)); A->data = (double**) malloc(n * sizeof(double*)); for (int i = 0; i < n; i++) { A->l[i] = i + 1; A->data[i] = (double*) malloc((i + 1) * sizeof(double)); for (int j = 0; j < i + 1; j++) A->data[i][j] = j + 1; } return A; } 每个指针都有一个对应的 malloc 调用。但我们也可以这样做: Arrays* BlockInitialization(int n) { // Constructs an array A of length n containing the arrays A[i] = [1,2,...,i] Arrays* A = (Arrays*) malloc(sizeof(Arrays) + n * sizeof(int) + n * sizeof(double*) + (n * (n+1) / 2) * sizeof(double) ); A->n = n; A->l = (int*) (A + 1); A->data = (double**) (A->l + n); A->data[0] = (double*) (A->data + n); for (int i = 0; i < n; i++) { A->l[i] = i + 1; for (int j = 0; j < i + 1; j++) A->data[i][j] = j + 1; if (i < n - 1) A->data[i+1] = A->data[i] + i + 1; } return A; } 这里有一个 malloc 调用,所有其他指针都是通过指针算术和转换从第一个调用获得的。我认为这在某些情况下可能会更有效,因为所有分配的内存都在一个块中。 那么,我想问:这种做法是否会导致未定义的行为?它会影响性能吗(在某些情况下)?是不是让代码变得更加晦涩难懂? 我在下面留下了一个 print 方法和一个 main 方法,表明两种初始化给出了相同的结果(至少在我的机器上)。 void PrintArrays(Arrays* A) { printf("Variable contains %d arrays: \n", A->n); for (int i = 0; i < A->n; i++) { printf("Array %d (of length %d): [", i, A->l[i]); for (int j = 0; j < A->l[i]; j++) { printf("%f", A->data[i][j]); if (j < A->l[i] - 1) printf(", "); } printf("] \n"); } } int main() { Arrays* A = BlockInitialization(10); PrintArrays(A); Arrays* B = UsualInitialization(10); PrintArrays(B); return 0; } 那么,我想问:这种做法是否会导致未定义的行为? 如果你做得正确就不会。 这里唯一明显的问题是,对于奇数 n,最终的指针和双打可能会错位。您需要使用 alignof 来计算连续成员之间需要多少填充。 它会影响性能吗(在某些情况下)? 是的,它可以在受益于缓存友好的内存布局的平台上使性能更好。 如果您丢失所有指针,展平二维数组并提供简单的访问器来获取/索引数组,可能会更好,因为即使看起来冗余的偏移量计算通常也比多个指针取消引用更快。 这会让代码变得更加晦涩吗? 是的,但是如果晦涩的位被封装在两个函数(分配器和释放器)中,你可以很好地注释它,彻底测试它,然后忘记它。

回答 1 投票 0

我不明白到底什么是动态内存分配

所以显然动态内存分配允许在运行时分配内存,而不是像静态内存分配那样在编译时分配内存。我也明白在 malloc.h 中使用这些函数...

回答 1 投票 0

用任意值初始化使用 malloc 创建的数组

我需要使用 malloc 创建大型浮点数组,以便在不再需要该数组时能够释放内存。 这些值是任意的,这意味着它们不全是零或全,更多是兰特......

回答 1 投票 0

使用范围挂钩时,大量分配元数据会导致 jemalloc 中出现碎片并浪费 DRAM

我正在编写一个简单的自定义范围分配器,它从预映射区域返回范围(这样我可以显式控制映射区域以及其中的分配)。我正在使用 dev 分支...

回答 1 投票 0

无法将值放在由指针和 malloc 启动的结构中

只是一个名为 person 的简单结构,里面我需要存储姓名和年龄。我正在尝试为我的结构动态分配内存。 不使用指针: #包括 #包括 只是一个名为 person 的简单结构,在里面我需要存储姓名和年龄。我正在尝试为我的结构动态分配内存。 不使用指针: #include <stdio.h> #include <stdlib.h> typedef struct person { char name[10]; int age; } person; int main(int argc, char *argv[]) { person a = {"bob", 15}; // Here, we can input values "together", all at once printf("name is %s, age is %i\n", a.name, a.age); return 0; } 到这里,就可以成功打印出: name is bob, age is 15 使用指针: int main(int argc, char *argv[]) { person *a = (person *) malloc(sizeof(person)); *a = {"bob", 15}; // Here I tried to input the all values printf("name is %s, age is %i\n", a->name, a->age); free(a); return 0; } 它不会编译并返回错误: expected expression before '{' token 好吧,如果我尝试一一输入值: int main(int argc, char *argv[]) { person *a = (person *) malloc(sizeof(person)); a->name = "bob"; a->age = 15; printf("name is %s, age is %i\n", a->name, a->age); free(a); return 0; } 可以成功打印出: name is bob, age is 15 我期望由于指针指向分配给结构体 person 的内存,因此可以像普通结构体一样一起输入值。但正如你所看到的,它不能。然而,当值被一一输入时,它就起作用了。 我做错了什么吗?或者使用指针时,需要一一输入值?谢谢。 您可能需要一个结构体文字。并且不要投射来自 malloc 的返回。 int main(void) { person *a = malloc(sizeof(person)); *a = (person){"bob", 15}; // Here I tried to input the all values printf("name is %s, age is %i\n", a->name, a->age); free(a); return 0; }

回答 1 投票 0

malloc():从二进制文件中删除条目时损坏的顶部大小

我正在创建一个学校管理系统。当我在添加学生后尝试删除学生时,出现“malloc():损坏的顶部大小”错误。无法找到原因。我是初学者,请帮助 P...

回答 1 投票 0

如何摆脱调用 fwrite 函数时的 C6387 警告?

在 Visual Studio 2022 中,当我调用 fwrite 时收到以下警告。 警告图像 C6387 它说:C6387:'fout'可能是'0':这不符合函数'fwr ...

回答 1 投票 0

malloc():损坏的顶部大小

我正在开发一个程序,可以解密文件中的某些文本行。首先,我创建的另一个源代码要求转换和一些文本。源代码对文本进行加密并将其写入文件中。 那个...

回答 2 投票 0

使用for循环给内存位置赋值时出错

我刚刚进入C编程世界,目前正在学习如何使用malloc和free。 我写了一个简短的练习代码来 printf 用 scanf 输入的字符串,我有

回答 1 投票 0

清除分配内存的功能不起作用

我正在尝试用C语言制作一个DTC。这是节点的结构: typedef 结构节点 { 整数值; 结构节点*下层; 结构节点*更高; } 节点; 释放使用...分配的内存

回答 1 投票 0

C 中用于清除已分配内存的函数不起作用

我正在尝试用C语言制作一个DTC。这是节点的结构: typedef 结构节点{ 整数值; 结构节点*下层; 结构节点*更高; }节点; 释放使用...分配的内存

回答 1 投票 0

是否可以将C++智能指针与C的malloc一起使用?

我的一些代码仍然使用malloc而不是new。原因是因为我害怕使用 new,因为它会抛出异常,而不是返回 NULL,我可以很容易地检查它。包裹每一个...

回答 10 投票 0

Malloc 有时在释放后立即失败

我想在内存不足的情况下测试我的代码。 我用 setrlimit 编写了这个函数来限制可用内存: 无符号短整型 oom_enable = 0; 字符* _oomfill = NULL; uint32_t oom_setup(

回答 1 投票 0

如何知道堆溢出点?

我正在尝试编写一个程序来确定给定范围内的所有回文。 我的程序调用一个函数(位数),该函数返回整数的大小(即 400 将是 3,因为它...

回答 1 投票 0

Mac OS Catalina sbrk 已弃用

我正在尝试用 C 语言实现自己的内存分配器。当我尝试在 Mac OS Catalina 的终端中编译代码时,它说函数“sbrk”已被弃用。是否

回答 2 投票 0

如何为malloc分配的数组释放内存?

我有两种代码变体: 第一: void PrintMem(const int* memarr,const size_t 大小) { 对于 (size_t 索引 = 0;索引 < size; ++index) { std::cout << '<'<<(index+1)<<...

回答 1 投票 0

显示错误值:C 指针或 malloc 问题?

我的程序将矩阵1乘以矩阵2。矩阵3就是结果。 我可以使用正确的值显示矩阵 1 和矩阵 2,但我无法显示相同的函数 exp...

回答 1 投票 0

使用malloc函数一次将所有未初始化的变量初始化为0

malloc 函数不应像 calloc 函数那样为其使用的任何变量初始化任何值。那么为什么我不断获得所有其他变量的初始化值...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.