realloc引用说:
该功能可以将存储块移动到新位置,在这种情况下返回新位置.
这是否意味着如果我这样做:
void foo() {
void* ptr = malloc( 1024 );
unsigned char* cptr = ( unsigned char* )ptr+256;
ptr = realloc( ptr, 4096 );
}
Run Code Online (Sandbox Code Playgroud)
那么如果realloc移动块,cptr可能会变为无效?
如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?
是否可以在不调用的情况下从函数返回字符串malloc?我有如下功能:
char* getString(){
char tempStr[20]
// open file, read char by char and assign to tempStr
// ....
char* str = (char*)malloc(sizeof(char)*20);
strcpy(str, tempStr); // assume this copy the null terminating char as well
return str;
}
Run Code Online (Sandbox Code Playgroud)
然后当我调用时getString(),我将返回值赋给a char*,然后在完成后将其释放,如下所示:
void randomFunction(){
char* line = NULL;
int i = 0;
while (i < 1000) {
line = getString();
// do stuff with line
free (line);
line = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道有没有办法做到这一点没有malloc?而且,这是从C函数返回字符串的正确方法吗?我试着做一些关于如何没有返回的研究malloc,但没有找到明确的答案.我是C的新手,还在学习.
作为C的新手,我从void指针中获得的唯一实际用法是用于在给定指针中存储不同数据类型的通用函数.因此,在进行内存分配时,我没有输入指针.
我见过一些有时使用void指针的代码示例,但是它们是类型转换的.为什么这有用?为什么不直接创建所需类型的指针而不是void?
这两个代码行的内存使用有什么不同吗?
int *a = malloc( 10 * sizeof(int) );
int b[10];
Run Code Online (Sandbox Code Playgroud)
第一行应为10个整数和1个指针分配内存.但我不确定第二个.那还会为10个整数和1个指针分配内存,还是只有10个整数?
随着最近的噪声C得到,我读到有一些方法可以最大限度地减少C中malloc的使用,这是一个非常好的做法.我怎么也不知道这种做法何时,如何或如何做好.所以我的问题是,也许一些经验丰富的C程序员可以提供一些例子,其中一个人可以(或应该)写一些没有malloc的东西,但对于新手C程序员来说真是不明显的方式(因此说新手只会使用malloc) ?也许你有一些经验可以将malloc分解成其他东西.
PS我读到的一些帖子引用了Quake 3源代码以及它如何避免使用malloc,所以如果有人知道这一点,知道在那里做了什么会很有趣,因为至少知道我想避免挖掘地震代码漫无目的.(因为如果他们避免使用malloc搜索malloc,我认为不会给出太多结果,而且代码库很可能不像单个示例那样简单)
此问题旨在用作此常见问题解答的规范副本:
我在一个函数内动态分配数据,一切运行良好,但只在分配发生的函数内部.当我尝试在函数外部使用相同的数据时,我会遇到崩溃或其他意外的程序行为.
这是一个MCVE:
#include <stdlib.h>
#include <stdio.h>
void create_array (int* data, int size)
{
data = malloc(sizeof(*data) * size);
for(int i=0; i<size; i++)
{
data[i] = i;
}
print_array(data, size);
}
void print_array (int* data, int size)
{
for(int i=0; i<size; i++)
{
printf("%d ", data[i]);
}
printf("\n");
}
int main (void)
{
int* data;
const int size = 5;
create_array(data, size);
print_array(data, size); // crash here
free(data);
}
Run Code Online (Sandbox Code Playgroud)
每当print_array从create_array函数内部调用时,我得到预期的输出0 1 2 3 4 …
c malloc parameter-passing pass-by-value dynamic-memory-allocation
malloc()失败的原因是什么,尤其是64位?
我的具体问题是试图在64位系统上使用巨大的10GB RAM.该机器具有12GB的RAM和32 GB的交换空间.是的,malloc极端,但为什么会出现问题呢?这是在Windows XP64中同时包含Intel和MSFT编译器.malloc有时成功,有时不成功,约50%.8GB malloc总是工作,20GB malloc总是失败.如果malloc失败,重复请求将不起作用,除非我退出该过程并再次开始一个新进程(这将成功获得50%的注射).没有其他大型应用程序正在运行 它会在重新启动后立即发生.
我可以想象如果你已经用完了32位(或31位)可用的地址空间,那么malloc会失败32位,这样就没有足够大的地址范围可以分配给你的请求了.
我还可以想象,如果你已经用完物理内存和你的硬盘交换空间,malloc会失败.对我来说情况并非如此.
但为什么malloc会失败呢?我想不出其他原因.
我对一般malloc问题比我的具体例子更感兴趣,无论如何我都可能用内存映射文件替换它.失败的malloc()只是一个难题而不是其他任何东西......想要了解你的工具而不是对基础知识感到惊讶.
我在初始化结构数组时遇到问题.我不确定我是否做得对,因为我得到"从不兼容的指针类型初始化"和"从不兼容的指针类型分配".我在代码中添加了这些警告,当我尝试从结构中打印数据时,我只是得到垃圾,例如@@ ###
typedef struct
{
char* firstName;
char* lastName;
int day;
int month;
int year;
}student;
Run Code Online (Sandbox Code Playgroud)
//初始化数组
student** students = malloc(sizeof(student));
int x;
for(x = 0; x < numStudents; x++)
{
//here I get: "assignment from incompatible pointer type"
students[x] = (struct student*)malloc(sizeof(student));
}
int arrayIndex = 0;
Run Code Online (Sandbox Code Playgroud)
//添加struct
//create student struct
//here I get: "initialization from incompatible pointer type"
student* newStudent = {"john", "smith", 1, 12, 1983};
//add it to the array
students[arrayIndex] = newStudent;
arrayIndex++;
Run Code Online (Sandbox Code Playgroud) 我在Unix系统上看到,malloc即使内存实际上不可用,也可以返回非NULL指针,并且稍后尝试使用内存将触发错误.由于我无法通过检查NULL来捕获这样的错误,我想知道检查NULL是多么有用?
Herb Sutter说,处理C++内存错误是徒劳的,因为系统会在实际发生异常之前很长时间内进行分页痉挛.这也适用malloc吗?
7.22.3.4 malloc函数malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的.
原型: void *malloc(size_t size);
我尝试将负值作为参数传递:malloc(negative)return NULL.
是因为[size_t]否定转换为无符号[某个大值]并且不能分配所需的空间或者是函数检查参数并返回NULL?
如果它转换为大正值,那么当malloc(INT_MIN+2)它调用它仍然返回NULL,但malloc(0)分配指针和*p = somevalue工作.那这个呢?
它是实现定义的吗?
阅读此链接:malloc(0)