我正在尝试运行下面的程序,在该程序中,我使用一个名为Reserve的函数动态地为变量分配内存。当我运行应用程序时,由于在一个单独的函数中为一个空指针分配内存,我会得到分段错误,但是如果我想在主函数中分配内存,我不会得到这个错误。那我做错了什么?
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct{
unsigned char state;
/* socket fd of the client */
int fd;
/* File path requested by the client */
char file_path [255];
/* Current file offset */
unsigned long int offset;
} STATE;
void reserve(int length, void *context_data ,void *buffer)
{
context_data = (char *) malloc(length);
memcpy(context_data, buffer, length);
}
int main()
{
STATE test;
int length = sizeof(STATE);
char buffer[1500];
char *ptr = buffer;
test.state = 10;
strcpy(test.file_path, "Hello How are you");
memcpy(ptr, &test, length);
ptr += length;
char *context_data;
reserve(length, context_data, buffer);
STATE *temp = (STATE *) context_data;
printf("File Path %s\n", temp->file_path);
printf("State %d\n", temp->state);
}
在此代码中:
void reserve(int length, void *context_data ,void *buffer)
{
context_data = (char *) malloc(length);
memcpy(context_data, buffer, length);
}
context_data
参数是通过值传递的,因此reserve
内的context_data
和reserve
外的context_data
不是同一个指针。因此,当您在此函数内部本地重新分配context_data
时,main
中的context_data
指针不会更新,从而导致崩溃。
要解决这个问题,要么接受一个指向context_data
变量的指针来更新,如下所示:
void reserve(int length, void **context_data ,void *buffer)
{
*context_data = malloc(length);
memcpy(*context_data, buffer, length);
}
reserve(length, &context_data, buffer);
void* reserve(int length,void *buffer)
{
void* context_data = (char *) malloc(length);
memcpy(context_data, buffer, length);
return context_data;
}
void* context_data = reserve(length, buffer);
问题内容: 每次从stdin读取字母“ u”时,此代码段将分配2Gb,并且在读取“ a”后将初始化所有分配的字符。 我在具有3Gb内存的linux虚拟机上运行此代码。在使用htop工具监视系统资源使用情况时,我已经意识到malloc操作不会反映在资源上。 例如,当我仅输入一次“ u”(即分配2GB的堆内存)时,我看不到htop中的内存使用量增加2GB。只有当我输入“ a”(即初始化)时,我才会看到
我的问题是,谁分配和管理这些内存段?操作系统不知道java程序正在运行,并认为它是JVM的一部分,作为计算机上的常规程序运行,JIT编译、java堆栈的使用,这些操作需要运行时内存分配,我不明白的是JVM如何将其内存划分为这些内存段。这肯定不是由操作系统来完成的,这些内存段(例如java堆栈)必须是连续的才能工作,所以如果JVM程序只是使用malloc命令来接收堆内存的最大大小并将这些内存划分为多
4. 分配内存的函数 除了malloc之外,C标准库还提供了另外两个在堆空间分配内存的函数,它们分配的内存同样由free释放。 #include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); 返回值:成功返回所分配内存空间的首地址,出错返回NULL calloc
我有一个func添加两个NO并返回(a+B)。然后我创建了一个指向func的func指针。希望为该函数指针的数组分配内存并访问它们。代码如下。 我的问题是使用malloc的下面一行: 编译时,sizeof(add_2nos*)和sizeof(add_2nos)没有任何区别。如果有什么区别??另外,如果类型转换是必要的,而我正在分配相同类型的内存…?
本文向大家介绍C++ 内存分配处理函数set_new_handler的使用,包括了C++ 内存分配处理函数set_new_handler的使用的使用技巧和注意事项,需要的朋友参考一下 一、函数的定义 函数在namespace std中有如下定义(C++98与C++11版本不一致): 二、函数介绍 该函数的作用是:当new操作或new[]操作失败时调用参数所指的new_p函数 异常安全: C++98
问题内容: 我刚从python移植了我的应用程序,所以Go有点新。看来我遇到了记忆问题。 它在ubuntu机器上运行。通过主管。 编辑: 设置解决问题 问题答案: 对于遇到此问题的其他人,这是golang问题中的相关近期问题 对于所有受影响的人,在Linux上得到适当修复之前的临时替代方法可以是以下之一: 启用无条件过量使用: 能够无条件过载:添加交换到你的主机,用它几乎永远不会被使用,但在计算参