- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始学习C编程并练习动态数组以及malloc和realloc。我正在使用 Visual Studio,代码位于文件扩展名 .c 中但我不知道为什么 realloc 会导致错误消息“HEAP[Assignment1Start.exe]:01217FA8 处的堆 block 在 01217FE8 处修改,过去请求的大小为 38”请按住 ctrl-f 这句话“Here I Want to realloc”它将引导您到导致错误消息的行。
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#define _NO_DEBUG_HEAP 1
int main()
{
FILE *ptr_file;
FILE *ptr_file2;
char buf[1000]; //1000 characters array. //if label[10] = "Single"; then label[2] outputs "n"// label[6] outputs "\0" // label[7] outputs " " empty space
char *vArray2; //is as pointer to a character, to which you allocated memory to hold exactly 1 character.
int NoOfTasks = 0;
char **ArrayNo;
char **ArrayTemp;
//#define ArrayCapacity 15
int ArrayCapacity = 20;
#define ID_LEN 10
int i;
int power = 1;
int quitbtn = 8;
ptr_file = fopen("output.txt", "r");
if (!ptr_file)
return 1;
ArrayNo = (char*)malloc(ArrayCapacity*sizeof(char)); //allocate some memory that your pointer will point to. //You should always make it point to something or you can allocate some memory that your pointer will point to.
ArrayNo[NoOfTasks] = malloc((ID_LEN + 1) * sizeof(char));
strcpy(ArrayNo[NoOfTasks], "Quit\n");
NoOfTasks += 1;
while (fgets(buf, 1000, ptr_file) != NULL) //fgets adds the \n to the end of each line it reads and stores it in buf //outputs to command prompt//If the end-of-file (EOF) is reached the fgets function will return a NULL value
{
ArrayNo[NoOfTasks] = malloc((ID_LEN + 1) * sizeof(char));
strcpy(ArrayNo[NoOfTasks], buf);
NoOfTasks += 1;
}
while (power == 1){
for (int r = 0; r < NoOfTasks; r++){
printf("%d %s", r,ArrayNo[r]);
}
printf("\n Please enter the task order number");
int userInputInt1 = 0;
scanf("%d", &userInputInt1);
if (userInputInt1 != 0) //0 is quit NoOfTasks-1
{
printf("\n %s (1)Add task (2) Remove Task (3)Replace Task", ArrayNo[userInputInt1]);
int userInputInt2 = 0;
scanf("%d", &userInputInt2);
//int result = atoi(userInput2); // convert string to int
if (userInputInt2 == 3)
{
printf("\n Type in new task");
char userInput3[30];
scanf("%s", &userInput3);
if (userInput3 != " "){
int n;
printf("\n %s Replaced with %s \n", ArrayNo[userInputInt1], &userInput3);
strcpy(ArrayNo[userInputInt1], &userInput3);
strcat(ArrayNo[userInputInt1], "\n");
}
}
if (userInputInt2 == 2) //remove
{
int n;
NoOfTasks -= 1;
for (int c = userInputInt1; c < NoOfTasks; c++){
printf("\n %s Replaced with %s", ArrayNo[userInputInt1], ArrayNo[c + 1]);
ArrayNo[c] = ArrayNo[c + 1];
}
}
if (userInputInt2 == 1) //add
{
printf("\n Add a task");
char userInput4[30];
scanf("%s", &userInput4);
ArrayCapacity += 1;// increase ArrayCapacity by 1 because a new task is added
ArrayNo = (char**)realloc(ArrayNo, (ArrayCapacity* sizeof(char*))); // here I want to realloc memory for new element of the array ArrayNo when a new task is added
ArrayNo[NoOfTasks] = malloc((ID_LEN + 1) * sizeof(char));
strcpy(ArrayNo[NoOfTasks], &userInput4);
NoOfTasks += 1;
}
}
if (userInputInt1 == 0) //8 is quit NoOfTasks-1
{
ptr_file2 = fopen("WriteTo2.txt", "w");
if (!ptr_file2)
return 1;
for (int r = 1; r < NoOfTasks; r++){
fprintf(ptr_file2, "%s\n", ArrayNo[r]);
}
printf("\n You quit the program");
fclose(ptr_file2);
fclose(ptr_file);
power = 0;
}
}
getchar();
getchar();
getchar();
return 0;
}
最佳答案
初始分配不正确。
ArrayNo
是 char**
。你也这么做了
ArrayNo = (char*)malloc(ArrayCapacity*sizeof(char));
这仅分配 ArrayCapacity
字节(sizeof(char)
为 1)。数组实际上需要更多,ArrayCapacity*4
或 ArrayCapacity*8
字节(sizeof(char*)
是 4 或 8;比方说如果是 4,那么 ArrayNo[5] 从偏移量 4*5 开始,该偏移量已经超出了分配的区域)。因此,当您填充数组时,您会覆盖一些不允许的内存字节,幸运的是 realloc
(在 Debug模式下)对此进行了检查,并在发现后立即停止执行内存损坏。
关于C语言动态数组realloc导致Heap block错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205013/
如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果没有,就会发生泄漏。
OS: Linux CC: GCC 4.8.2 目标:改变 char* 的大小 -> 变小 问题:更改后的大小相同... 行是带有数据的字符串... 代码片段: char * tmp = NUL
在一个函数中我使用了 malloc : void name1(struct stos* s) { s = malloc (4 * sizeof (int)); } 一切正常。但是后来我用了rea
我知道有一个 realloc允许我调整内存块大小的函数(它与一个免费函数配对)。但是,我正在尝试对一些成员指针使用 new 而不是 realloc 分配内存的 c++ 类执行相同的操作。在 C++ 中
我正在尝试在 C 中创建一个动态整数数组,它应该在填满后自动将其大小加倍。 要扩展数组的大小,我想使用 realloc 函数。不幸的是,指向我的 DynamicArray 和 GCC 崩溃的数据的指针
这是我被教导使用的方式 realloc() : int *a = malloc(10); a = realloc(a, 100); // Why do we do "a = .... ?" if(a
我尝试在每个循环中使用 realloc(),因此我只为 C 中的 int 数组使用必要的内存,但输出值已更改。尽管如此,在我的代码中使用 Valgrind 时,我得到了正确的值。 我在做 Advent
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我想知道如果我尝试 realloc() 一个已递增的指针会发生什么。
我知道可以在内核中使用 malloc 在 GPU 的全局内存上分配内存。是否也可以使用realloc? 最佳答案 您可以为您的数据类型编写自己的 realloc 设备函数。 只需为新数组分配新空间,将
我在对数组使用 malloc/realloc 命令时遇到了一些问题。我创建了一个包含一些整数的小数组,并尝试通过使用 realloc 扩展大小并添加值来为其添加一个值,但是当我这样做时,0 索引的值不
背景: 我使用 calloc() 创建了一个数组,一切都运行良好。然后我使用 realloc() 使数组更大。它似乎只是创建一个没有任何内容的新指针,并在我尝试访问数组中的元素时调用运行时错误。 我的
假设我已经使用 malloc() 分配了内存,如果我在我的代码中这样做: char *newline = realloc ( oldline , newsize ); // Assuming oldl
我正在尝试在下面的程序中使用 realloc 重新分配内存,并在我使用 malloc(i = (int*)malloc(5 * sizeof(int))) 使用react的 realloc 初始内存之
为什么下面的代码输出两次 4,而不是 8 和 20?谢谢 int size = 0; int *pointer; pointer = malloc(2 * sizeof(int)); size = s
我正在尝试将一堆 WCHAR 添加到缓冲区。这个函数就是将它添加到我的缓冲区中的原因.. DWORD add_to_buffer(BYTE *databuffer, WCHAR *path, WCHA
可能我的大脑现在不能正常工作......我想知道为什么我在我的代码中收到提到的错误: int ** zm; zm = (int**)calloc(1, sizeof(int*)); *zm = (in
我正在尝试用 C 语言编写代码,但遇到了 realloc 的问题。该代码在某个时间点工作正常,但在另一时间重新分配期间因堆损坏错误而崩溃。我已将填充数据的结构和函数粘贴到其中。谁能告诉我我是否在这里做
realloc 会改变它的第一个参数吗? 改变第一个参数是否取决于实现? 有什么理由不应该是const吗?作为反例,memcpy 将其 src 参数设为 const。 ISO C 标准,第 7.20.
我在 realloc 中遇到此错误,该错误仅发生在我学校的实验室计算机上,而不发生在我的计算机上。 在此程序中,我将行号存储在 File_Node 结构中。 File_Node 是一个链表的一部分,每
来自 man realloc:realloc() 函数返回一个指向新分配的内存的指针,该指针适合任何类型的变量,可能与 ptr 不同,如果请求失败,则返回 NULL . 因此在此代码片段中: ptr
我是一名优秀的程序员,十分优秀!