下面的代码在Windows中执行时返回一个地址,虽然我希望它返回NULL.
int main()
{
char *ptr = NULL;
ptr = malloc(0);
printf("malloc returned = %u\n", ptr);
}
Run Code Online (Sandbox Code Playgroud)
什么可能促使malloc的这种实现?它背后有什么理由吗?
因为,这是一个0字节的内存,我没有尝试写任何数据.但是,这个记忆可以用于任何东西吗?
以下是发生分段错误的代码段(不会调用perror):
job = malloc(sizeof(task_t));
if(job == NULL)
perror("malloc");
Run Code Online (Sandbox Code Playgroud)
更确切地说,gdb说segfault在__int_malloc调用内部发生,这是一个子例程调用malloc.
由于malloc函数与其他线程并行调用,最初我认为它可能是问题所在.我使用的是glibc 2.19版.
数据结构:
typedef struct rv_thread thread_wrapper_t;
typedef struct future
{
pthread_cond_t wait;
pthread_mutex_t mutex;
long completed;
} future_t;
typedef struct task
{
future_t * f;
void * data;
void *
(*fun)(thread_wrapper_t *, void *);
} task_t;
typedef struct
{
queue_t * queue;
} pool_worker_t;
typedef struct
{
task_t * t;
} sfuture_t;
struct rv_thread
{
pool_worker_t * pool;
};
Run Code Online (Sandbox Code Playgroud)
现在未来的实施:
future_t *
create_future()
{ …Run Code Online (Sandbox Code Playgroud) 是否可以在指向结构的第一个成员的指针上调用free(并且结构是与malloc有关的结构)?我原则上知道指针指向正确的东西......
struct s {int x;};
//in main
struct s* test;
test = (struct s*) malloc(sizeof(*test));
int* test2;
test2 = &(test->x);
free(test2); //is this okay??
Run Code Online (Sandbox Code Playgroud)
此外,如果int x用结构代替,答案会改变吗?
更新:为什么我要编写这样的代码?
struct s {int x;};
struct sx1 {struct s test; int y;}; //extending struct s
struct sx2 {struct s test; int z;}; //another
// ** some functions to keep track of the number of references to each variable of type struct s
int release(struct s* ptr){
//if the number of references to …Run Code Online (Sandbox Code Playgroud) 如果内存被分配malloc(而不是new)并且对象被移动到该内存中,那么该C++是否有效?假设我为n个类型的对象数组分配内存T,并且我有一系列n类型的对象T我想要移入其中,这是有效的:
T* next = (T *)malloc(n*sizeof(T));
T* t = std::begin(my_range);
while (we still have more Ts) {
*next = std::move(*t);
++next;
++t;
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我很好奇它为什么会这样,因为我们从未在我们移动到的已分配内存中新建对象.
我的猜测是放置新的是正确的方法:
while (we still have more Ts) {
new (next) T(*t);
++next;
++t;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么第一个是不正确的,如果是的话,如果它只是运气或因为T恰好是POD.
我正在尝试使用std:getline()但遇到一个奇怪的运行时错误:
malloc:*对象0x10000a720的错误:未释放指针被释放*在malloc_error_break中设置断点以进行调试
这是产生此错误的代码:
//main.cpp
#include <iostream>
#include <sstream>
int main (int argc, char * const argv[])
{
std::istringstream my_str("demo string with spaces");
std::string word;
while (std::getline(my_str, word, ' ')) {
std::cout << word << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在每个单词之前我都会收到此错误.从评论中看起来似乎是OSX/XCode特定的错误.有什么提示吗?
更新: 错误仅在调试模式下打印.如果我在发布模式下构建此代码,一切都很好.
更新2: 可以在此处找到有关该问题的更多信息.
解:
组
_GLIBCXX_FULLY_DYNAMIC_STRING = 1
在目标信息构建选项卡中的预处理器宏中.
系统信息:
OSX 10.6.2 | XCode 3.2 | g ++ 4.2 | 调试i386的配置
可能重复:
c malloc和calloc之间的区别
是否有任何情况你更喜欢malloc而不是calloc.我知道malloc和calloc都动态分配内存,而calloc也将所有内存中的所有位初始化为零.从这个我会猜测它总是更好地使用calloc而不是malloc.或者在某些情况下malloc更好?表现可能是?
我想使用malloc并分配内存并检查它是否成功.就像是:
if (!(new_list=(vlist)malloc(sizeof (var_list))))
return -1;
Run Code Online (Sandbox Code Playgroud)
我该如何检查成功?
我有一个缓冲区,想要做一个测试,看看缓冲区是否有足够的容量,我可以找到我可以添加到缓冲区的元素数量.
char *buffer = (char *)malloc(sizeof(char) * 10);
Run Code Online (Sandbox Code Playgroud)
做一个
int numElements = sizeof(buffer);
Run Code Online (Sandbox Code Playgroud)
不回10,有关如何实现这一点的任何想法?
我对MIPS汇编语言很陌生,目前正在上一个关于MIPS编码的计算机体系结构课程.我以前学过其他几种高级编程语言(C,C#,Python),因此在编程方面有一些基础.
我的问题在这里特别问:MIPS如何为堆栈中的数组分配内存?我希望回答这个问题有望让我更好地理解MIPS,因为我仍然在概念化MIPS语言及其架构的概念.我不太明白指针在这方面是如何工作的......
如果有人可以花时间帮助这个迷茫的学生,那将是辉煌的!:)
指针与关系运算符相比较(例如<,<=,>=或>)仅由C标准定义当相同的聚合对象(结构,阵列或联合)内的指针都指向.这在实践中意味着形状的比较
if (start_object <= my_pointer && my_pointer < end_object+1) {
Run Code Online (Sandbox Code Playgroud)
可以变成
if (1) {
Run Code Online (Sandbox Code Playgroud)
通过优化编译器.尽管如此,在K&R的第8.7节"示例 - 存储分配器"中,作者进行了与上述类似的比较.他们原谅这个说法
然而,仍然有一个假设是,
sbrk可以有意义地比较返回的不同块的指针.标准不保证这一点,它只允许在数组中进行指针比较.因此,这个版本malloc只能在一般指针比较有意义的机器之间移植.
此外,它出现的执行malloc用在glibc做同样的事情!
更糟糕的是 - 我偶然发现这一点的原因是 - 对于学校作业我应该实现一个基本的malloc功能,并且作业的指示要求我们使用K&R代码,但我们必须更换sbrk拨打电话mmap!
虽然比较来自不同sbrk调用的指针可能是未定义的,但它也只是略微可疑,因为你有某种心理直觉,返回的指针应该来自同一个内存区域.mmap根据我的理解,不同调用返回的指针甚至不能保证彼此远程相似,并且在mmap调用之间合并/合并内存块应该是非常非法的(并且它似乎glibc避免了这种情况,只需合并返回的内存)通过sbrk或内部内mmap,而不是在它们之间)的页面,但分配需要这个.
问题:有人可以发光
sbrk可以优化比较来自不同呼叫的指针,以及glibc那会让他们逃脱它.