malloc 相关问题

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

使用malloc定义字符串地址

运行此代码时没有任何输出。我期望使用大写值写入文件,并将大写值打印到屏幕上。 #包括 #包括 运行此代码时没有任何输出。我期望使用大写值写入文件,并将大写值打印到屏幕上。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(int argc, const char * argv[]) { FILE *fP; char *str = "this is an example"; /* Im not sure if this line is right */ str = (char *)malloc(sizeof(char) * 100); fopen("4.txt", "w"); size_t length = strlen(str); for (size_t i = 0; i < length; i++) { /* This line fails */ fprintf(fP, "%c", toupper(*(str +i ))); printf("%c", toupper(*(str +i ))); } return 0; } 您正在运行 fopen() 而不返回 fp ,这只会打开文件流,但不会让它被 fp 引用,您需要将该行更改为 fp = fopen("4.txt" , "w"); 您也在 str 上运行 strlen() ,但由于您分配了内存但没有在其中存储任何内容(之前分配的字符串被覆盖),它将返回一个随机数( malloc() 给出了一个内存块而不清除以前的内存,因此,无论以前使用它的程序都将存储在其中),您都需要使用 strcpy() 将字符串设置到其中,如下所示 strcpy(str , "this is an example"); 如果解决了这两个问题,它应该可以运行。

回答 1 投票 0

来自 Valgrind 日志的 malloc 内存泄漏

我正在做CS50练习:许可证。这段代码是从txt文件中读取车牌并打印出来。 有人可以帮我知道为什么我的代码仍然存在内存泄漏吗? 我仍然收到...

回答 1 投票 0

为什么malloc不malloc?

这里用一个C程序来介绍这个问题。 #包括 #包括 #包括 int main(int argc, char *argv[]) { 如果(参数!= 2){ printf("

回答 1 投票 0

我需要c

#包括 #包括 typedef int 数据类型; typedef 结构 singleLinkedList { 数据类型数据; 结构 singleLinkedList *下一个; }节点; typedef 节点 *linkList; 无效

回答 1 投票 0

MISRA C 建议不要使用 malloc,这是否意味着 calloc 更安全?

我已经使用C几年了,但最近才认真努力地理解未定义的行为和C内存泄漏的陷阱等。这是因为现在我在某些地方多次使用calloc...

回答 1 投票 0

可以使用初始或终端 malloc 缓冲区吗?

假设我做了如下事情: size_t长度=1000; char* p = malloc(长度); 然后我想循环遍历元素,所以最基本的是: 对于 (size_t i = 0; i < length; ++i) { p[i...

回答 1 投票 0

如何为结构体中的动态结构体数组分配内存?

我有以下结构,我正在尝试为下面的结构区域分配空间。 目前,我将该区域的空间分配为: 区域 *区域 = (区域*)malloc(sizeof(区域) + (大小...

回答 1 投票 0

Leetcode链表二第142题,解法错误,但为什么能成功?

这是我在leetcode中写的代码我知道它的实现是错误的,但是为什么会这样呢? struct ListNode *detectCycle(struct ListNode *head) { struct ListNode *cur = h...

回答 1 投票 0

计算 malloc() 和 realloc() 大小的正确方法?

我见过 malloc() 和 realloc() 使用了很多不同的方式。在测试了各种方法之后,我很好奇我是否正确使用了它们? 首先我尝试过 int 大小 = rowSize * colSize...

回答 2 投票 0

重新分配先前分配的指向 SIZE_MAX 的指针不会设置 ENOMEM,但重新分配 NULL 可以吗?

问题: 我正在努力重写一些 malloc 函数(malloc、calloc、realloc 和 free),并且我决定实现一些单元测试,希望能让自己的事情变得更容易一些...

回答 1 投票 0

链接列表在第二次迭代期间打印符号而不是单词

我是 C 语言的初学者,所以我知道我的代码可能看起来很糟糕。我想做的就是创建一个链表,其中包含一个包含字符数组和频率整数的结构。它读取的行来自...

回答 1 投票 0

“释放”由“malloc”返回的指针总是安全的吗?

我的理解是,允许使用调用 malloc 返回的指针来调用 free(或任何其他返回指向堆上动态分配的内存的指针的函数,例如 strdup...

回答 1 投票 0

在C中返回char *时如何避免内存泄漏?

我有一个类似 C 语言的代码库,其中有一个需要返回 char * 的函数。有没有办法修改此代码,以便我可以返回 char * 而不会像这里一样导致内存泄漏?油嘴滑舌是

回答 1 投票 0

当 LC_CTYPE 设置为 C.UTF-8 时,Bash 在 Valgrind 中崩溃

Bash 5.2 由于 malloc 中的断言失败而崩溃,但仅当在 Valgrind 中运行且仅当设置 LC_CTYPE 时才会崩溃。这是一个示例输出: $ 路径/to/env - foo=bar LC_CTYPE=C.UTF-8 路径/to/valgrind

回答 1 投票 0

即使在释放 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

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