标签: malloc

为什么malloc(0)在Windows中返回非空地址?

下面的代码在Windows中执行时返回一个地址,虽然我希望它返回NULL.

int main()
{
   char *ptr = NULL;
   ptr = malloc(0);
   printf("malloc returned = %u\n", ptr);

}
Run Code Online (Sandbox Code Playgroud)

什么可能促使malloc的这种实现?它背后有什么理由吗?

因为,这是一个0字节的内存,我没有尝试写任何数据.但是,这个记忆可以用于任何东西吗?

c malloc memory-management

11
推荐指数
3
解决办法
926
查看次数

Malloc分段错误

以下是发生分段错误的代码段(不会调用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)

c stack-overflow malloc buffer-overflow segmentation-fault

11
推荐指数
2
解决办法
4万
查看次数

是否可以使用指向第一个成员的指针自由调用?

是否可以在指向结构的第一个成员的指针上调用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)

c malloc free struct padding

11
推荐指数
2
解决办法
158
查看次数

是将对象移动到malloc内存有效的C++中?

如果内存被分配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.

c++ malloc move placement-new

11
推荐指数
1
解决办法
209
查看次数

C++使用getline()打印:释放的指针未在XCode中分配

我正在尝试使用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 macos xcode getline

10
推荐指数
1
解决办法
4079
查看次数

喜欢malloc而不是calloc

可能重复:
c malloc和calloc之间的区别

是否有任何情况你更喜欢malloc而不是calloc.我知道malloc和calloc都动态分配内存,而calloc也将所有内存中的所有位初始化为零.从这个我会猜测它总是更好地使用calloc而不是malloc.或者在某些情况下malloc更好?表现可能是?

c malloc calloc

10
推荐指数
1
解决办法
5723
查看次数

检查`malloc`是否在C中成功

我想使用malloc并分配内存并检查它是否成功.就像是:

if (!(new_list=(vlist)malloc(sizeof (var_list))))
  return -1;
Run Code Online (Sandbox Code Playgroud)

我该如何检查成功?

c malloc

10
推荐指数
3
解决办法
3万
查看次数

如何确定分配的C缓冲区的大小?

我有一个缓冲区,想要做一个测试,看看缓冲区是否有足够的容量,我可以找到我可以添加到缓冲区的元素数量.

char *buffer = (char *)malloc(sizeof(char) * 10);
Run Code Online (Sandbox Code Playgroud)

做一个

int numElements = sizeof(buffer); 
Run Code Online (Sandbox Code Playgroud)

不回10,有关如何实现这一点的任何想法?

c malloc buffer buffer-overflow

10
推荐指数
4
解决办法
5万
查看次数

MIPS - MIPS如何为堆栈中的数组分配内存?

我对MIPS汇编语言很陌生,目前正在上一个关于MIPS编码的计算机体系结构课程.我以前学过其他几种高级编程语言(C,C#,Python),因此在编程方面有一些基础.

我的问题在这里特别问:MIPS如何为堆栈中的数组分配内存?我希望回答这个问题有望让我更好地理解MIPS,因为我仍然在概念化MIPS语言及其架构的概念.我不太明白指针在这方面是如何工作的......

如果有人可以花时间帮助这个迷茫的学生,那将是辉煌的!:)

malloc assembly mips computer-architecture

10
推荐指数
1
解决办法
2万
查看次数

是什么让glibc malloc可以比较来自不同"对象"的指针?

指针与关系运算符相比较(例如<,<=,>=>)仅由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,而不是在它们之间)的页面,但分配需要这个.

问题:有人可以发光

  1. 是否sbrk可以优化比较来自不同呼叫的指针,以及
  2. 如果是这样,glibc那会让他们逃脱它.

c malloc glibc language-lawyer

10
推荐指数
1
解决办法
356
查看次数