我有一段由一位非常老的学校程序员编写的代码:-).它就是这样的
typedef struct ts_request
{
ts_request_buffer_header_def header;
char package[1];
} ts_request_def;
ts_request_def* request_buffer =
malloc(sizeof(ts_request_def) + (2 * 1024 * 1024));
Run Code Online (Sandbox Code Playgroud)
程序员基本上正在研究缓冲区溢出概念.我知道代码看起来很狡猾.所以我的问题是:
malloc总是分配连续的内存块吗?因为在这段代码中如果块不连续,代码将失败很长时间
执行free(request_buffer),它将释放malloc分配的所有字节,即sizeof(ts_request_def)+(2*1024*1024),或者只释放结构sizeof(ts_request_def)大小的字节
你是否看到这种方法有任何明显的问题,我需要与老板讨论这个问题,并想指出这种方法有任何漏洞
我特别关注何时在char指针上使用malloc
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
Run Code Online (Sandbox Code Playgroud)
malloc是否会为了这个微不足道的东西?如果是,为什么?如果没有,那么什么时候需要char指针?
我有一个非常简单的C代码,用于构建如下所示的单链接列表,其中我使用malloc动态地为每个节点分配内存.在代码结束时,我想为每个分配的节点释放内存,想知道如何去做 - 如果我首先从头节点开始并释放它,那么指向后续节点的指针就会丢失并发生内存泄漏.
其他方式是从头节点开始并将节点指针保存在单独的指针或其他数组中,在存储节点指针时遍历列表直到尾指针,并且一旦到达尾节点,也将其存储到另一个数组指针并开始从该数组索引向后释放,直到头节点被释放.
这是实现我想要做的唯一方法吗?
如果我不想使用第二个缓冲区,我该怎么做呢.
#include "stdio.h"
#include "stdlib.h"
struct lnk_lst
{
int val;
struct lnk_lst * next;
};
typedef struct lnk_lst item;
main()
{
item * curr, * head;
int i,desired_value;
head = NULL;
for(i=1;i<=10;i++)
{
curr = (item *)malloc(sizeof(item));
curr->val = i;
curr->next = head;
head = curr;
}
curr = head;
while(curr) {
printf("%d\n", curr->val);
curr = curr->next;
}
//How to free the memory for the nodes in this list?
for(i=1;i<=10;i++)
{
free()//?? What logic here …Run Code Online (Sandbox Code Playgroud) 我正在为C写一个内存分析器,因为它拦截了对mall的调用malloc,realloc并free通过malloc_hooks 来调用函数.不幸的是,由于它们在多线程环境中的不良行为而被弃用.我找不到描述替代最佳实践解决方案的文档来实现同样的事情,有人可以启发我吗?
我已经读过一个简单的#define malloc(s) malloc_hook(s)方法可以解决这个问题,但是这对我想到的系统设置不起作用,因为它太过于干扰原始代码库,不适合在分析/跟踪工具中使用.必须手动更改原始应用程序代码是任何体面的分析器的杀手.最理想的是,我要寻找的解决方案只需链接到可选的共享库即可启用或禁用.例如,我当前的设置使用声明的函数__attribute__ ((constructor))来安装拦截malloc挂钩.
谢谢
我在一些不同的函数中有一些代码看起来像这样:
void someFunction (int *data) {
data = (int *) malloc (sizeof (data));
}
void useData (int *data) {
printf ("%p", data);
}
int main () {
int *data = NULL;
someFunction (data);
useData (data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
someFunction ()并useData ()在单独的模块(*.c文件)中定义.
问题是,虽然malloc工作正常,并且分配的内存可用someFunction,但一旦函数返回,相同的内存就不可用.
这里可以看到程序的示例运行,输出显示各种存储器地址.
有人可以向我解释我在这里做错了什么,以及如何让这段代码工作?
编辑:所以似乎我需要使用双指针来做这个 - 当我真的需要使用双指针时,我将如何做同样的事情?所以例如数据就是
int **data = NULL; //used for 2D array
Run Code Online (Sandbox Code Playgroud)
那么我是否需要在函数调用中使用三指针?
可能重复:
c malloc和calloc之间的区别
请解释一下这句话的意义,
malloc()和calloc()函数之间的另一个区别是malloc()函数分配的内存包含垃圾值,而calloc()函数分配的内存包含全零.
来源('C'编程,Salim Y. Amdani)
谢谢
我有一个包含父进程和子进程的程序.在fork()之前,父进程调用malloc()并用一些数据填充数组.在fork()之后,孩子需要那些数据.我知道我可以使用管道,但以下代码似乎有效:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main( int argc, char *argv[] ) {
char *array;
array = malloc( 20 );
strcpy( array, "Hello" );
switch( fork() ) {
case 0:
printf( "Child array: %s\n", array );
strcpy( array, "Goodbye" );
printf( "Child array: %s\n", array );
free( array );
break;
case -1:
printf( "Error with fork()\n" );
break;
default:
printf( "Parent array: %s\n", array );
sleep(1);
printf( "Parent array: %s\n", array );
free( array );
} …Run Code Online (Sandbox Code Playgroud) 我正在编写具有大量1维和2维数组的代码.我得到了"错误:无法分配区域",我认为是因为分配了太多内存.我使用"malloc"和"free"函数,但我不确定我是否正在使用它们.也许你知道我在哪里可以看到C中内存管理的好例子?
所以..我只是想让一个算法工作,现在这个代码只是函数后的函数..
//memory allocation for 1D arrays
buffer = malloc(num_items*sizeof(double));
//memory allocation for 2D arrays
double **cross_norm=(double**)malloc(150 * sizeof(double *));
for(i=0; i<150;i++)
{
cross_norm[i]=(double*)malloc(num_items*sizeof(double));
}
//code
Window(N, window_buffer);
STFTforBMP(buffer,N,f, window_buffer);
getMagnitude(buffer,f, N, magnitude);
calculateEnergy(flux,magnitude, f);
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f);
calculateCrossCorrelation(cross, flux, expected_values, f);
findLargestCrossCorrelation(&cross_max, cross, f);
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f);
...............
Run Code Online (Sandbox Code Playgroud)
我该如何使用该free功能?
基于我在这里学到的东西:通过C中的函数操作动态数组.
void test(int data[])
{
data[0] = 1;
}
int main(void)
{
int *data = malloc(4 * sizeof *data);
test(data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我也试图realloc在函数中使用.
void increase(int data[])
{
data = realloc(data, 5 * sizeof *data);
}
Run Code Online (Sandbox Code Playgroud)
这符合但运行时程序崩溃.
题
我应该如何在函数中使用realloc?
我知道我应该将结果分配给realloc变量并检查它是否是NULL第一个.这只是一个简化的例子.
我在测试程序中观察到以下行为:
我正在malloc()为1 MB,然后free()之后sleep(10)。我做了五次。我正在观察top程序运行时的内存消耗。
一次free()-d,我期望程序的虚拟内存(VIRT)消耗将减少1 MB。但实际上并非如此。它保持稳定。这种现象的解释是什么?malloc()分配内存时是否做一些保留?
c ×10
malloc ×10
free ×2
pointers ×2
arrays ×1
calloc ×1
char ×1
coding-style ×1
deprecated ×1
fork ×1
gcc ×1
glibc ×1
heap ×1
linked-list ×1
linux ×1