malloc 相关问题

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

即使在释放 C 中的 malloc 空间后,Valgrind 也会检测到可到达的块(cs50 问题集 4 恢复)

我已经完成了cs50的第4题recover。您将在下面看到我对一个名为 sfile 的 char* 使用了 malloc。在文件的末尾,我记得释放分配的空间(又名 sf...

回答 1 投票 0

我可以在 C 中 free() 一些已经在 C++ 中 malloc() 过的东西吗?

我正在为用 C++ 编写的库编写一个包装器,以便可以从 C 中使用它。在包装器代码中,我制作了 C++ 容器底层数据的大量副本。例如。如果 C++ 库

回答 1 投票 0

如何在 Cython 中将大型 malloc 数组返回或保存为 Python 对象?

我想使用 Cython 从模型创建大量模拟样本,稍后需要使用 Python 进行分析。我的模拟脚本运行一次的结果应该是 10000 x 10000 arr...

回答 1 投票 0

malloc:检测到堆损坏,空闲列表已损坏

我的应用程序在 iOS 12 之前运行良好。将我的 iOS 版本更新到 iOS 13 beta 后,该应用程序在随机位置崩溃并出现相同的错误。以下是 Xcode 控制台。 我的应用程序(618,0x10cebd8...

回答 1 投票 0

如何从 stdlib 取消定义 calloc() 函数以使用我们自己的函数

我有一个头文件calloc.h,其中我使用stdlib的malloc()函数定义了calloc()函数。但我收到“calloc”错误的多重定义。 calloc.h: #包括 #包括...

回答 1 投票 0

程序运行,但 Valgrind 在尝试写入 malloc 内存时检测到问题

为了了解更多 C 语言,我正在尝试重新创建基本数据结构。这是我尝试数组的一个最小示例,该数组可以编译并运行,但 valgrind 检测到问题: #包括 为了了解更多 C 语言,我正在尝试重新创建基本数据结构。这是我尝试数组的一个最小示例,该数组可以编译并运行,但 valgrind 检测到问题: #include <stdlib.h> #include <stdio.h> typedef void * vp_t; typedef struct { int len; vp_t *start; } arr_t; arr_t * array_new(int len) { arr_t *arr = malloc(sizeof(arr_t)); arr->start = malloc(len * sizeof(vp_t)); arr->len = len; return arr; } void array_set(arr_t *arr, int i, vp_t vp) { vp_t *dest = arr->start + i * sizeof(vp_t); *dest = vp; } int array_get(arr_t *arr, int i) { int *p = *(arr->start + i * sizeof(vp_t)); return *p; } void array_delete(arr_t *arr) { free(arr->start); free(arr); } int main() { int x=0, y=1, z=2; arr_t *arr = array_new(3); array_set(arr, 0, &x); array_set(arr, 1, &y); array_set(arr, 2, &z); for (int i = 0; i < 3; ++i) printf("%i ", array_get(arr, i)); putchar('\n'); array_delete(arr); return 0; } 程序按预期输出 1 2 3。然而,当我第二次和第三次调用 array_set 函数时,valgrind 检测到了一个问题。针对此处的示例代码运行 valgrind,我得到: ==91933== Invalid write of size 8 ==91933== at 0x109244: array_set (min.c:22) ==91933== by 0x109312: main (min.c:39) ==91933== Address 0x4a990d0 is 32 bytes before an unallocated block of size 4,194,032 in arena "client" ==91933== ==91933== ==91933== Process terminating with default action of signal 11 (SIGSEGV) ==91933== Access not within mapped region at address 0x2003A98F4C ==91933== at 0x109244: array_set (min.c:22) ==91933== by 0x109327: main (min.c:40) min.c:22指的是array_set函数中的*dest = vp。 min.c:39指的是array_set(arr, 1, &y)。 Valgrind 不抱怨第 38 行,array_set(arr, 0, &x)。 我一直在研究gdb,但我还没弄清楚。感谢您的浏览。 当您需要寻址数组时,只需将多少个单元格(除了单元格大小)添加到指针即可。 void array_set(arr_t *arr, int i, vp_t vp) { vp_t *dest = arr->start + i; *dest = vp; } int array_get(arr_t *arr, int i) { int *p = *(arr->start + i); return *p; } arr->start 的类型为 vp_t,因此当您向指针添加 1 时,编译器将增加所需的数量 (sizeof(vp_t)) 以转到下一个单元格。 这就是解决方案,但首先为什么,你需要一个 void ** 数组,如果你想创建一个整数数组,请使用 int** 创建,只有当你需要任何类型的数组时才推荐使用 void 数组。 不管怎样,错误在于你创建了一个 void* (一维),而实际上,应该是一个二维数组 void ** #include <stdlib.h> #include <stdio.h> typedef struct { int len; void **start; } arr_t; arr_t * array_new(int len) { arr_t *arr = malloc(sizeof(arr_t)); arr->start = malloc(len * sizeof(void*)); arr->len = len; return arr; } void array_set(arr_t *arr, int i, void *vp) { arr->start[i] = vp; } int array_get(arr_t *arr, int i) { return *(int*)arr->start[i]; } void array_delete(arr_t *arr) { free(arr->start); free(arr); } int main() { int x=0, y=1, z=2; arr_t *arr = array_new(3); array_set(arr, 0, &x); array_set(arr, 1, &y); array_set(arr, 2, &z); for (int i = 0; i < 3; ++i) printf("%i ", array_get(arr, i)); putchar('\n'); array_delete(arr); return 0; }

回答 2 投票 0

我怎样才能同时返回并释放内存

我有一个函数,它分配内存,然后用数据填充它,然后返回它。 我想释放这个分配的内存,但如果我在返回之前释放它,它将返回 null,如果我尝试释放...

回答 2 投票 0

为什么malloc这么大的内存会出现访问内存错误?

正如你所看到的,当我运行它时,我遇到了内存访问错误。但是如果 我将malloc_size更改为100,它可以工作。如何在不更改 malloc_size 的情况下修复它。 int malloc_size = 900000; 浮动* ptr = (

回答 1 投票 0

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同吗

为什么 C++ 需要自己版本的 C 标准库 malloc/calloc/realloc/free 函数?它们看起来完全一样。我应该更喜欢在 C++ 中使用 std:: 版本吗?他们的行为可以不同吗...

回答 1 投票 0

如何分配二维数组? [重复]

我需要创建一个二维数组。目前我将其创建为 整数a[100][100] 但我需要使用 C 语言中的 malloc 动态分配内存。我用了代码 #包括 我需要创建一个二维数组。目前我将其创建为 int a[100][100] 但是我需要使用C语言中的malloc动态分配内存。我用了代码 #include <stdio.h> #include <stdlib.h> int main(void) { int n=6, m=5, i, j; int **a = malloc(n * sizeof(int *)); for(i = 0; i < m; i++) a[i] = malloc(m * sizeof(int)); for( i = 1; i <= n; i++ ) { for( j = 1; j <= m; j++ ) { scanf("%d %d",&a[i][j]); } } return 0; } 但是现在在将元素输入数组时它显示分段错误。 您在评论中说n是行数。因此,您需要分配 n 行,每行长度为 m。因此,第二个for循环条件应该是i < n。另外,您应该检查 malloc 的返回值,以防分配内存失败。我建议进行以下更改 -NULL 请注意,多维数组并不是一种全新的类型。它只是一个元素数组,其中每个元素本身就是一个数组(对于 2D 数组)、数组的数组(对于 3D 数组)等等。如果您使用long long **a = malloc(n * sizeof(*a)); for (i = 0; i < n; i++) { a[i] = malloc(m * sizeof(*a[i])); } ,您可以干净简洁地分配数组,如C99 您还应该了解一下 - 我如何在 C 中使用动态多维数组? 您有三个错误:第一个是您仅分配了 int nrow = 4; // number of rows int ncol = 8; // number of columns // define arr to be a pointer to an array of ncol ints, i.e., // arr is a pointer to an object of type (int[ncol]) int (*arr)[ncol] = malloc(sizeof(int[nrow][ncol])); // check the result of malloc for NULL if (arr == NULL) { printf("malloc failed to allocate memory\n"); // handle it } // do stuff with arr for (int i = 0; i < nrow; i++) { for (int j = 0; j < ncol; j++) { arr[i][j] = i + j; } } // after you are done with arr free(arr); 辅助数组,但在输入中您循环了其中的 5。 第二个问题是数组索引是基于零的,即索引从零开始,直到大小减一。 第三个问题是你扫描了两个数字(为什么?),但你只提供了一个指向6的目标指针。 你只需要 scanf 如果你想要一大块内存。 如果您想要一个 long *a = malloc(100*100*sizeof(long)); 指针数组,然后每个数组位于单独的内存块中,请像这样: long* 这会创建 1 个 long **a = malloc(100*sizeof(long*)); for (i=0; i<100; i++) { a[i] = malloc(100*sizeof(long)); } 指针数组,然后创建 1 个每个指针有 100 个 long* 的数组,但我现在不确定你是否说 longs 例如,它是否会计算元素的位置,就像它的位置一样一个连续的块。检查出。 :) 如果你有 C99 使用可变长度数组 a[10][15] 否则需要手动计算索引。 你的代码有很多问题 首先,您需要 #include <stdio.h> #include <stdlib.h> int main(void) { unsigned rows, cols; printf("Enter rows and columns: "); fflush(stdout); scanf("%u%u", &rows, &cols); int (*a)[cols]; // pointer to VLA a = malloc(rows * cols * sizeof a[0][0]); if (a) { for (unsigned r = 0; r < rows; r++) { for (unsigned c = 0; c < cols; c++) { a[r][c] = r*c; } } printf("the element at [4, 2] is %d\n", a[4][2]); free(a); } return 0; } ,但您只为 long long a[100][100]s 分配足够的空间 int 您还越界访问数组。索引从 0 开始到 array_length-1。 另一个问题是你扫描了 2 个 int 值,但只提供了 1 的地址。 a[i] = malloc(m * sizeof(int)); 您可以分配一个 100 元素的指针数组,每个指针都指向另一个 100 元素数组的数组,但这并不好,因为执行 100 scanf("%d %d",&a[i][j]); 需要时间,并且生成的内存很可能不是连续的,这使得它的缓存不友好。还有一个小的内存开销,因为内存分配器必须将其四舍五入到最接近的块大小,这很可能是 2 的幂,当您在第一维中分配越来越多的元素时,它可能会很大。 您应该声明一个大小为 100*100 的一维数组。这将更快并提高缓存一致性。要获取 malloc 处的元素,只需执行 a[i][j] a[i*WIDTH + j]

回答 5 投票 0

在c中使用free()时发生异常,分段错误;

我的代码以某种方式运行,但它没有给出预期的结果,所以为了理解它,我开始调试,它显示发生了异常,我使用 free() 的行出现了分段错误。 哈...

回答 1 投票 0

如何找到指针错误的根源

#包括 #包括 #包括 #include“splitter.h” #定义四_K 4096 SplitResult split_join(int argc, char *argv[]) { 分割结果...

回答 1 投票 0

PyList_New() 导致分段错误“free():invalidpointer”

我正在尝试将 2D C 数组转换为 2D Python 列表。但是当代码尝试调用 PyList_New() 时,我遇到分段错误。行和列的大小通常固定为 50。这发生在

回答 1 投票 0

fprintf 在 while 循环中无法正常工作

我一直在学习C语言中的动态内存分配并在代码中进行练习。虽然我认为我已经正确分配了内存,但我可能是错的。所以任何有用的评论都是

回答 1 投票 0

(GNU+Linux) 多个线程同时调用malloc()

我在网上读到,大多数现代 UNIX 系统默认都带有线程安全的 malloc()。我知道这仅仅意味着一个线程可以安全地调用 malloc(),而另一个线程已经在中间......

回答 1 投票 0

使用矩阵时使用Sprintf

我尝试在下面的代码中运行 sprintf 函数,但它给出了段错误,不知道为什么。 #包括 #包括 #包括 int main(int argc, char ...

回答 1 投票 0

将 char* 分配给 void* 字段

我需要编写一个程序来读取文件行并将它们保存在链接队列中。我正在使用一个在每个节点中使用 void* 数据字段的库。 当我尝试打印存储的所有行时,程序

回答 1 投票 0

我应该在这段代码中放置“free(BlockOfMemory)”吗?

#包括 #包括 int main() { int *numbers = malloc(5 * sizeof(int)); // Speicherplatz auf 10 ints vergrößern int *temp = realloc(数字, 10 * sizeo...

回答 2 投票 0

我不知道我必须把“free(BlockOfMemory)”放在哪里

int main() { int *numbers = malloc(5 * sizeof(int)); // Speicherplatz auf 10 ints vergrößern int *temp = realloc(数字, 10 * sizeof(int)); 如果(临时!= NULL){ 数字 = t...

回答 1 投票 0

如何修复 valgrind“条件跳转或移动取决于未初始化的值”错误?

我有这个简单的程序: #包括 #包括 #包括 int 主函数(无效){ 字符*str; 字符串=空; str = malloc(sizeof(char) * 20); 圣...

回答 1 投票 0

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