我正在为一项任务实施尾部.我有它正常工作,但我似乎在随机时间免费获得错误.
我无法看到,追踪到一个模式或除了它之外的任何东西是一致的.
例如,如果我将我的程序称为"tail -24 test.in",我将在多次运行时在同一行中得到错误的校验和错误.但是,使用不同的文件,甚至不同的行数打印回来,我会回来没有错误.
关于如何追踪问题的任何想法,我一直试图调试它几个小时无济于事.
这是违规代码:
lines被定义为char**,并且malloc为:
lines = (char**) malloc(nlines * sizeof(char *));
void insert_line(char *s, int len){
printf("\t\tLine Number: %d Putting a %d line into slot: %d\n",processed,len,slot);
if(processed > numlines -1){//clean up
free(*(lines+slot));
*(lines + slot) = NULL;
}
*(lines + slot) = (char *) malloc(len * sizeof(char));
if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
strcpy(*(lines+slot),s);
slot = ++processed % numlines;
}
Run Code Online (Sandbox Code Playgroud) 我意识到下面的代码示例是你永远不应该做的事情.我的问题只是一个有趣的问题.如果你分配一块内存,然后移动指针(一个禁忌),当你释放内存时,释放的块的大小是多少,内存在哪里?这是人为的代码片段:
#include <stdio.h>
#include <string.h>
int main(void) {
char* s = malloc(1024);
strcpy(s, "Some string");
// Advance the pointer...
s += 5;
// Prints "string"
printf("%s\n", s);
/*
* What exactly are the beginning and end points of the memory
* block now being deallocated?
*/
free(s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是我认为我发生的事情.被释放的内存块以保存字符串"s"的字节开头.持有"Some"的5个字节现在丢失了.
我想知道的是:5个字节在内存中的位置是否紧跟原始1024字节的末尾,也就是说,它们是否只是单独存在?
任何人都知道编译器的作用是什么?这是不确定的?
谢谢.
我是C的初学者.在阅读git的源代码时,我发现了这个包装函数malloc.
void *xmalloc(size_t size)
{
void *ret = malloc(size);
if (!ret && !size)
ret = malloc(1);
if (!ret) {
release_pack_memory(size, -1);
ret = malloc(size);
if (!ret && !size)
ret = malloc(1);
if (!ret)
die("Out of memory, malloc failed");
}
#ifdef XMALLOC_POISON
memset(ret, 0xA5, size);
#endif
return ret;
}
Run Code Online (Sandbox Code Playgroud)
问题
malloc(1)?release_pack_memory和我在整个源代码中找不到这个函数实现.#ifdef XMALLOC_POISON memset(ret, 0xA5, size);作用?我打算在我的项目中重用这个功能.这是一个很好的包装malloc?
任何帮助都会很棒.
我正在处理的应用程序的一部分是一个简单的基于pthread的服务器,它通过TCP/IP套接字进行通信.我在C中编写它是因为它将在内存受限的环境中运行.我的问题是:如果其中一个线程遇到返回NULL的malloc(),程序应该怎么做?到目前为止我想出的可能性:
第一种选择显然是最简单的,但似乎非常错误.第二个也似乎错了,因为我不确切知道会发生什么.第三个选项,似乎除了两个问题诱人的:首先,所有的线程不需要在正常情况下和第二连接回主线程,以完成该线程执行,其余大部分线程必须调用malloc( )无论如何.
我该怎么办?
如何将malloc放在另一个结构体内?
我还想在结构中malloc一个项目数组,然后在需要时重新分配这个数组,这是如何正确完成的?
你能举个例子来说明一个结构,然后是上面的结构.
我有点不确定事情的顺序.
结构中的数组是否会被释放,然后结构本身,结构在创建时是否必须被malloced,然后它的字段被malloced /声明等?
在C内存分配/释放中由malloc和完成free.
在C++内存分配/释放由new和完成delete.
C++中有一些用于自动内存管理的解决方案,例如:
但是如何在C中进行自动内存管理?
C中的AUTOMATIC内存管理有什么解决方案吗?
对于C,有没有任何指导或类似的指导?
当我忘记free一块记忆时我想要:
- 要么 -
然后我说:哦,C比C++,Java和C#更好.:-)
我想知道是否calloc()优于a malloc后跟a memset.后者似乎是分配和初始化内存的最常用方式.
一个GitHub的代码搜索变成了许多calloc测试和实现,但在页面的第一个数字代码没有实际使用calloc.
有谁知道任何使用或推荐使用的项目/组织calloc以及推荐它的情况?
从下面的评论和答案中,以下是迄今为止出现的一些想法:
calloc(n, size) 可以防止溢出 malloc(n * size)
结合malloc和memset使calloc有机会请求已知已经归零的页面.
calloc的一个缺点是组合的步骤可能会排除malloc周围的其他包装器.
阅读Martin Sustrick撰写的有关在C++中防止"未定义行为"的问题的博客,特别是由于内存耗尽而导致malloc()失败的问题,我被提醒了很多次,我很沮丧地知道是什么在这种情况下做.
对于虚拟系统来说,这种情况很少见,但是在嵌入式平台上,或者在击中虚拟系统时伴随着性能下降等同于失败的情况,正如Martin对ZeroMQ的情况一样,我决定找到一个可行的解决方案,并且做到了.
我想向StackOverflow的读者询问他们是否尝试过这种方法,以及他们使用它的经验.
解决方案是在程序开始时调用malloc()从堆中分配一块备用内存,然后使用该备用内存池来避免内存耗尽.这个想法是为了防止投降有利于有序撤退(我正在阅读Kesselring昨晚对意大利的辩护的说法),其中错误信息和IP套接字等工作时间足够长(希望)至少告诉用户发生了什么.
#define SPARE_MEM_SIZE (1<<20) // reserve a megabyte
static void *gSpareMem;
// ------------------------------------------------------------------------------------------------
void *tenacious_malloc(int requested_allocation_size) {
static int remaining_spare_size = 0; // SPARE_MEM_SIZE;
char err_msg[512];
void *rtn = NULL;
// attempt to re-establish the full size of spare memory, if it needs it
if (SPARE_MEM_SIZE != remaining_spare_size) {
if(NULL != (gSpareMem = realloc(gSpareMem, SPARE_MEM_SIZE))) {
remaining_spare_size = SPARE_MEM_SIZE;
// "touch" the memory so O/S will allocate physical …Run Code Online (Sandbox Code Playgroud) 我有一段代码,我试图在括号内抓取一个表达式,然后使用它.在下面的代码开始的时候,我正在迭代字符数组,并且pcc是指向当前字符的指针,该字符已被确定为a '('.我的目标是将paranthetical表达式放在一个字符数组中pe.
int nnrp = 1; /* Net number of right parantheses */
char * pbpe = pcc; /* Pointer to the beginning paranthetical expression */
for (++pcc; *pcc!= '\0' && nnrp != 0; ++pcc)
{
if (*pcc == '(')
{
++nnrp;
}
else if (*pcc == ')')
{
--nnrp;
}
else if (*pcc == '\0')
{
sprintf(err, "Unbalanced paranthesis");
return -1;
}
}
/* If we're here, *pcc is the closing paranathesis of *pbpe …Run Code Online (Sandbox Code Playgroud) 在C中执行函数(通过malloc)后释放已分配内存的正确方法是什么?我需要分配内存,以某种方式使用它并将其返回,而不是我必须释放它.
char* someFunction(char* a, char* b) {
char* result = (char*)malloc(la + 2 * sizeof(char));
...
return result;
}
Run Code Online (Sandbox Code Playgroud)