嘿大家,我得到一堆腐败错误,我无法弄清楚.
char * c = (char *) malloc(1);
// main loop
_gcvt_s(c, 100, ball->get_X_Direction(), 10);
if(pushFont(c, (SCREEN_WIDTH - 30), (SCREEN_HEIGHT - 40), message, screen,
font, textColor) == false)
{
//return 1; // error rendering text.
}
// end main loop
free(c);
Run Code Online (Sandbox Code Playgroud)
上面的代码是我在_gcvt_s和pushFont()中使用c指针的唯一时间,它只接受char*作为其第一个参数,并将文本放在屏幕上.除此之外,我不使用c.当我尝试在主循环之后释放c(我认为我应该这样做)时,我得到一个错误,说Visual Studio已经获得了堆的错误(堆损坏).
注释掉对pushFont的调用我仍然收到错误.
任何人都可以向我解释为什么释放一个字符(我在堆上分配的1个字节)会给我一个堆损坏?
最后我的主循环做了很多东西,一个伙伴和我正在用WinSocket做一个乒乓球游戏,主体的其余部分是游戏的循环.我不认为有必要发帖,但如果有必要,我会用整个主循环更新我的帖子,但我相信我对malloc()和free()的理解是对的.
谢谢大家,
这可以在c中做吗?
int *i;
// do stuff
i = NULL;
i = (int *) some_func();
// do stuff
if (i != NULL)
free(i);
i = NULL;
// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
free(i);
i = NULL;
Run Code Online (Sandbox Code Playgroud) 内存是iphone ipad应用程序的一个问题,特别是对于ipad,如果想要做一些大事.
那么,这两个代码片段可以1.获得设备的当前可用内存; 2.强制释放记忆.
我们可以在应用程序中使用它吗?appstore会允许吗?
#import <mach/mach.h>
#import <mach/mach_host.h>
static void print_free_memory () {
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics");
/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total); …Run Code Online (Sandbox Code Playgroud) 当我在这部分代码中释放我的记忆时...我收到一个错误显示为:free():无效的下一个大小(快)
int insertRecord(char *record,int recordSize,long dataPageNumber)
{
datapage *dataPage=(datapage *)malloc(sizeof(datapage));
readPage(dataPage,dataPageNumber);
slotentry slot;
//for checking and freeslotnumber storage
int freeSlotNumber=-1;
int negativeFlag=0;
int freeFlag=0;
if(recordSize+sizeof(slotentry)<=dataPage->cfs)
{
slot.slotsize = recordSize;
slot.slotaddress = dataPage->cfsptr;
dataPage->cfs -= (recordSize+sizeof(slotentry));
dataPage->cfsptr += recordSize;
dataPage->slotcount++;
memcpy(&dataPage->data[slot.slotaddress],record,recordSize);
free(dataPage);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
执行free(dataPage)后,我收到上述错误...
typedef struct
{
int pagenumber;
int priority;
long dirPageNo;
long cfs;
int cfsptr;
int slotcount;
char data[1];
} datapage;
typedef struct
{
int slotaddress;
int slotsize;
} slotentry;
Run Code Online (Sandbox Code Playgroud)
我在memcpy之前保持free(dataPage)它工作正常但是在memcpy之后它没有工作..并显示错误....任何人都可以帮助我解决这个问题...
我对Pointers和内存模型相当新,所以如果这很明显,请原谅我,但我正在编写一个程序来测试反转列表的函数反转.无论如何,我有三个文件,C5.c,C5-driver.c和C5.h. 他们按顺序在这里:
#include "C5.h"
#include <stdlib.h>
#include <stdio.h>
struct node *cons(int fst, struct node *rst) {
struct node *new = malloc(sizeof(struct node));
if (new == NULL) {
printf("cons: out of memory\n");
abort();
}
(*new).first = fst; /* same as (*new).first = fst */
(*new).rest = rst;
return new;
}
struct node *reverse(struct node *lst) {
struct node *ans = NULL;
while (lst != NULL) {
ans = cons((*lst).first, ans);
lst = (*lst).rest;
}
return ans;
}
void free_list(struct node *lst) …Run Code Online (Sandbox Code Playgroud) 这真的很奇怪......我无法调试它(尝试了大约两个小时,调试器在一段时间后开始变得干扰...).无论如何,我正在尝试做一些非常简单的事情:
Free an array of strings.该数组的形式如下:
char **myStrings.数组元素初始化为:
myString[index] = malloc(strlen(word));
myString[index] = word;
Run Code Online (Sandbox Code Playgroud)
我正在调用这样的函数:
free_memory(myStrings, size); 其中size是数组的长度(我知道这不是问题,我对它进行了广泛的测试,除了这个函数之外的所有东西都在工作).
free_memory 看起来像这样:
void free_memory(char **list, int size) {
for (int i = 0; i < size; i ++) {
free(list[i]);
}
free(list);
}
Run Code Online (Sandbox Code Playgroud)
现在这里出现了奇怪的部分.if (size> strlen(list[i]))然后程序崩溃了.例如,假设我有一个类似于下面的字符串列表:
myStrings[0] = "Some";
myStrings[1] = "random";
myStrings[2] = "strings";
Run Code Online (Sandbox Code Playgroud)
因此这个数组的长度是3.
如果我把它传递给我的free_memory函数,strlen(myStrings[0]) > 3(4> 3),程序崩溃了.
然而,如果我改变myStrings[0]为"So"代替,然后strlen(myStrings[0]) < 3(2 …
这个
#include <stdlib.h> // test.c
int main()
{
double *arr = (double*) calloc(1000, sizeof(arr));
for (int i = 0; i < 1000; i++)
arr[i] = 1;
free(arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译为
gcc test.c -std=c99 -o test
Run Code Online (Sandbox Code Playgroud)
Aborted (core dumped)在Cygwin上运行时生成输出./test.exe.
程序退出时,罚款我宣布int *arr(甚至同时保持(double *)施法),或者当我更新arr[0]的替代arr[i].是什么赋予了?
我正在尝试在名为image的结构上使用malloc.功能是:
void image_init(struct image* img, int w, int h) {
img = malloc(sizeof(struct image));
(*img).w = w;
(*img).h = h;
}
Run Code Online (Sandbox Code Playgroud)
并且再次释放图像的功能是:
void image_destroy(struct image* img) {
free(img);
}
Run Code Online (Sandbox Code Playgroud)
但每当我试图释放malloc-ed数据时,我都会收到错误,即我试图释放的地址之前没有进行过malloc-ed.
图像结构是:
struct image {
int w,h;
int* data;
}
Run Code Online (Sandbox Code Playgroud)
我用以下函数调用函数:
struct image img;
image_init(&img,100,100);
image_destroy(&img);
Run Code Online (Sandbox Code Playgroud) 我有个问题.我正在为a分配空间char*,但是当我尝试free这个空间时,我的程序崩溃了.
这是代码
fullPath = (char *) malloc(strlen(path) + strlen(fileData->d_name) + 1);
if (fullPath == NULL)
{
handleErrors(ERR_ALOCATION_CODE);
}
sprintf(fullPath, "%s/%s", path, fileData->d_name);
//... some more code, I only use fullPath, I don't change it here
free(fullPath);
Run Code Online (Sandbox Code Playgroud)
上面的代码在尝试时失败了free.我将不胜感激.
我是C语言的新手,我对分配内存有疑问。因此,我在下面尝试了应释放结构elem1的这段代码。
struct elem{
char *data1;
char *data2;
};
int main()
{
struct elem *elem1 = malloc(sizeof(struct elem));
elem1->data1 = "abc";
elem1->data2 = "def";
char *a = elem1->data1;
char *b = elem1->data2;
free(elem1);
printf("%s\n%s\n",a,b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该代码可以很好地编译并返回,
abc
def
Run Code Online (Sandbox Code Playgroud)
我希望它会失败,因为免费还应该释放其成员的记忆。但是为什么行得通呢?释放结构后,如果我想访问结构的成员该怎么办?