我写了一个方法来释放我的结构.现在我有一个问题.当我两次调用此方法时,它会给我一个错误.但我确实检查我的结构中是否有某些东西,所以我不知道它是如何可能给我错误的.
我的结构:
typedef struct {
int num_rows;
int num_cols;
int** data;
} matrix;
Run Code Online (Sandbox Code Playgroud)
我的免费方法:
void free_matrix(matrix* m){
int i;
for(i=0;i<m->num_rows;i++){
if(m->data[i]!=NULL){
free(m->data[i]);
}
}
if(m->data!=NULL){
free(m->data);
}
}
Run Code Online (Sandbox Code Playgroud)
额外方法:
void fill_matrix_a(matrix* m){
m->data[0][0] = 1;
m->data[0][1] = 0;
m->data[0][2] = 2;
m->data[1][0] = 0;
m->data[1][1] = 3;
m->data[1][2] = 1;
}
void fill_matrix_b(matrix* m){
m->data[0][0] = 0;
m->data[0][1] = 3;
m->data[1][0] = 2;
m->data[1][1] = 1;
m->data[2][0] = 0;
m->data[2][1] = 4;
}
void init_matrix(matrix* m, int num_rows, int num_cols){ …Run Code Online (Sandbox Code Playgroud) 我使用malloc,memset和free时遇到问题,这不能按预期工作.问题在于最新的printf功能,而不是打印"test",它打印一些奇怪的字符,然后进行测试,比如"@#°test".你能解释我为什么吗?我注意到如果我在第二个malloc之后做了一个memset,一切正常.另外,即使没有memset,如果我不调用函数"function()",我真的不明白为什么一切正常
这是我的代码:
#define size 10
void function(){
...
...other code...
...
char *b=malloc(size);
read(file_ds,b,size); //file_ds stands for file descriptor, correctly opened with open function.
memset(b,0,size);
free(b);
}
void main(){
...
...other code...
...
function(); //If I don't call this, everything works fine, even without a memset
char *c=malloc(size);
strcat(c,"test");
printf("%s",c);
}
Run Code Online (Sandbox Code Playgroud) 我一直试图释放通过malloc()使用分配的内存free().
它的一些结构是免费的,但它们保留了它们的方式,它们也与它们的孩子保持联系.它也永远不会释放(gRootPtr)二叉树的根.
我正在使用Xcode来查明二叉树使用的内存是否已被释放,并使用if语句.
我用来释放内存的代码:
void FreeMemory(InfoDefiner *InfoCarrier)
{
if ((*InfoCarrier) != NULL) {
FreeMemory((&(*InfoCarrier)->left));
FreeMemory((&(*InfoCarrier)->right));
free((*InfoCarrier));
}
}
Run Code Online (Sandbox Code Playgroud)
代码我用来查看内存是否已被释放.
if (gRootPtr != NULL) {
return 1;
}
else{
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我遇到了一个面试问题,他们要求在C++中实现malloc()和free函数.
最开始声明一个大小为50000的char数组(50000字节).假设这是堆内存,编写malloc和free函数来分配内存块并释放内存.
任何人都可以为我提供C++工作/伪代码或只是解释机制?(显然代码会让它更容易理解).
谢谢,罗希特
在C中,我在编写以下示例时遇到错误:
int *pointer;
int i = 0;
pointer = malloc(10 * sizeof(int));
pointer[i - 1] = 4;
Run Code Online (Sandbox Code Playgroud)
显然i是负面指数pointer.
即使错误的片段内存被更改,为什么只在free(pointer)[稍后在代码中] 触发错误?错误是:double free or corruption (out).
编辑:使用的编译器是 gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
为什么下面的(公认的深奥)指针操作会导致以下错误:
*** Error in /home/ubuntu/workspace/Project 3/Debug/Project 3': double free or corruption (out): 0x00007fffffffd7c0 ***
int *intPointer = malloc(sizeof(int));
*intPointer = 1;
int intArray[] = { *intPointer };
int *intPointer2 = &intArray[0];
free(intPointer2);
Run Code Online (Sandbox Code Playgroud) 我被教导如果你做malloc(),但你没有free(),内存将一直保持到重新启动.好吧,我当然测试了它.一个非常简单的代码:
#include <stdlib.h>
int main(void)
{
while (1) malloc(1000);
}
Run Code Online (Sandbox Code Playgroud)
我在任务管理器(Windows 8.1)中查看了它.
嗯,该程序真的很快就占用了2037.4 MB而且就这样.我知道它可能是Windows限制程序.
但这是奇怪的部分:当我关闭控制台时,内存使用百分比下降,即使我被教导它不应该!
免费呼叫是多余的,因为操作系统无论如何都要释放它?
(这里的问题是相关的,但不能完全回答我是否应该自由.)
嗨所以我正在创建一个程序,它使用哈希来存储文本文件中的单词及其出现次数.这按预期工作.我遇到的问题来自于释放分配的内存.
这是我的哈希
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include"hash.h"
/*
struct listnode{
char * word;
int count;
};
*/
void hashCreate(struct listnode * hashTable[], int size){
int i;
for(i=0;i<size;i++){
hashTable[i]=(struct listnode *)malloc(sizeof(struct listnode));
hashTable[i]->count=0;
}
}
int hash(char * data, int size) {
unsigned long hash = 5381;
char * p;
for (p = data; *p != '\0'; ++p) {
hash = (hash * 33) + *p;
}
return (int)(hash % size);
}
void hashAdd(char * data, struct listnode * hashTable[], int …Run Code Online (Sandbox Code Playgroud) 关于我的代码,下面有一些混淆.
我使用malloc()分配内存,释放它,然后使用与参数相同的指针ptr调用realloc(),但不要使用realloc的返回地址.
此代码编译并运行精细打印预期的字符串.我没想到它因为ptr之前被释放了.
但是,如果我将realloc()的返回地址分配给ptr而不是注释掉,那么当然会出现运行时错误,因为ptr将为NULL.
如果我只是将之前释放的ptr作为参数传递,为什么它可以工作.它显然再次分配内存?提前致谢.
注意:此代码是故意编写的,目的只是为了尝试了解后台发生的情况.当然不建议取消引用悬空指针等.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* ptr;
ptr = (char*)malloc(20);
strcpy(ptr, "Hello");
printf("Address before free : %d\n", ptr);
printf("%s\n", ptr);
free (ptr);
printf("Address after free : %d\n", ptr);
printf("%s\n", ptr);
realloc(ptr, 30);
//ptr = realloc(ptr, 30); // causes runtime problem as expected
strcpy(ptr, "Hello");
printf("Address after realloc : %d\n", ptr);
printf("%s\n", ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 如果我为指针动态分配了空间,请列出以下内容:
int *a = (int*)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
代码完成后,我应该释放一个吗?谢谢!