#include <stdio.h>
typedef struct node
{
int i;
struct node *next;
}node;
node getnode(int a)
{
struct node n;
n.i=a;
n.next=NULL;
return n;
}
main()
{
int i;
node newtemp,root,temp;
scanf("%d",&i);
root=getnode(i);
temp=root;
while(i--)
{
newtemp=getnode(i);
temp.next=&newtemp;
if(root.next==NULL)
{
root=temp;
}
temp=*(temp.next);
}
temp=root;
while( temp.next != NULL )
{
printf(" %d ",temp.i);
temp=*(temp.next);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在不使用malloc的情况下创建链表.编程只打印根,后面没有节点.我找不到这个bug.如果有任何内存问题,gcc编译器会抛出一个分段错误.(?)请忽略糟糕的编程风格..
我想要一个最小的o-damn-malloc-just-failed处理程序,它将一些信息写入文件(可能只是标准错误).我更喜欢使用fprintf()而不是write(),但如果fprintf()本身尝试使用malloc(),则会失败.
是否有一些保证,无论是在C标准,还是只是在glibc,fprintf不会这样做?
每当你研究进程的内存分配时,你通常会看到它如下所示:

到现在为止还挺好.
但是你有sbrk()系统调用,允许程序改变其数据部分的上限,它也可以用来简单地检查sbrk(0)的限制.使用该功能,我发现了以下模式:
模式1 - 小malloc
我在Linux机器上运行以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int globalVar;
int main(){
int localVar;
int *ptr;
printf("localVar address (i.e., stack) = %p\n",&localVar);
printf("globalVar address (i.e., data section) = %p\n",&globalVar);
printf("Limit of data section = %p\n",sbrk(0));
ptr = malloc(sizeof(int)*1000);
printf("ptr address (should be on stack)= %p\n",&ptr);
printf("ptr points to: %p\n",ptr);
printf("Limit of data section after malloc= %p\n",sbrk(0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
localVar address (i.e., stack) = 0xbfe34058
globalVar address (i.e., data section) = 0x804a024 …Run Code Online (Sandbox Code Playgroud) 我想我已经把它归结为最基本的情况:
int main(int argc, char ** argv) {
int * arr;
foo(arr);
printf("car[3]=%d\n",arr[3]);
free (arr);
return 1;
}
void foo(int * arr) {
arr = (int*) malloc( sizeof(int)*25 );
arr[3] = 69;
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
> ./a.out
car[3]=-1869558540
a.out(4100) malloc: *** error for object 0x8fe01037: Non-aligned pointer
being freed
*** set a breakpoint in malloc_error_break to debug
>
Run Code Online (Sandbox Code Playgroud)
如果有人能够阐明我的理解失败的地方,我们将不胜感激.
我编写了以下示例程序,但它与segfault崩溃.问题似乎是在结构中使用malloc和std::strings.
#include <iostream>
#include <string>
#include <cstdlib>
struct example {
std::string data;
};
int main() {
example *ex = (example *)malloc(sizeof(*ex));
ex->data = "hello world";
std::cout << ex->data << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何让它发挥作用.任何想法,如果它甚至可以使用malloc()和std::strings?
谢谢,Boda Cydo.
我以为我无法像.lengthJava中的简单函数那样检索分配的内存块的长度.但是,我现在知道,在malloc()分配块时,它会分配额外的字节来保存包含块大小的整数.该整数位于块的开头; 实际返回给调用者的地址指向刚刚超过此长度值的位置.问题是,我无法访问该地址来检索块长度.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *str;
str = (char*) malloc(sizeof(char)*1000);
int *length;
length = str-4; /*because on 32 bit system, an int is 4 bytes long*/
printf("Length of str:%d\n", *length);
free(str);
}
Run Code Online (Sandbox Code Playgroud)
**编辑:我终于做到了.问题是,它持续给出0作为长度而不是我系统上的大小是因为我的Ubuntu是64位.我将str-4更改为str-8,现在可以使用了.
如果我将大小更改为2000,则会生成2017年的长度.但是,当我改为3000时,它给出3009.我正在使用GCC.
我期待了解GNU/Linux系统中动态内存管理如何在低级别工作(也就是说,ptmalloc如何工作).
当然,我已经阅读了代码,但我有很多疑问.我或多或少地了解数据结构,但我有很多信息泄漏!
我的问题是,如果有人知道任何资源详细解释实施.例如,我读过诸如"通过打破它来理解堆"或"Malloc Malleficarum"系列和后期系列等论文.他们做得很好,但是,当然,他们更专注于利用,而不是解释许多实施细节.
如果你不知道任何资源,这里有一些我的问题.
什么是竞技场?在来自heap_info结构的变量ar_ptr的代码中,有一条评论说"这个堆的竞技场",所以一个竞技场不能是一个堆(就像所说的那样).
为什么在heap_info结构中没有下一个指针并且有一个prev指针?是因为main_arena?什么是main_arena?
每个heap_info结构都可以有多个竞技场(指向不同的malloc_state结构)?
什么时候创建新闻竞技场和什么代码处理它?我已经读过,当请求存储数据的竞技场被锁定时(因为进程或进程线程正在使用它),我创建了新的竞技场,并且我还读到每个进程线程都有不同的竞技场.这里重要的是你知道什么代码处理这些情况.
我也不明白人们什么时候说所有的记忆操作都来自顶级大块或者大块头.你知道我在哪里可以找到这段代码吗?
顺便说一下,我不想深入了解互斥锁细节.
我正在审查glibc 2.12.1中的ptmalloc实现.我想做一些关于一切的整体结构的图表,所以我需要了解这些事情!
谢谢.
我有一个混合的C/C++程序.它包含一个以C/C为目标的flex/bison解析器,其余为C++.
作为C,生成的解析器和扫描器用malloc,realloc和管理它们的内存free.它们足以暴露钩子,允许我提交我自己的这些函数的实现.正如你所料,(C++)程序的其余部分"要"来使用new,delete等等.
进行一些研究似乎表明,相关标准并不能保证这种混合应该起作用.特别是C"堆"不一定是C++"自由区".看来这两个方案可以相互踩踏.
最重要的是,有一天(很快),该程序可能希望集成一个自定义的堆实现,例如tcmalloc,由C和C++使用.
在这里做什么是"正确"的事情?
鉴于需要集成tcmalloc(它解释了如何与C程序链接),我很想在C++内存管理中找到一些跨类型,跨线程,跨所有重载/钩子/任何东西.有了这个,我可以将所有C++分配/释放调用回到它们的C等价物(反过来又落在tcmalloc上).
是否存在这样的泛星系全局C++钩子?可能它已经在做我想要的,类似于ios_base::sync_with_stdio默认情况下秘密地与iostream和stdio结合?
我对谈论stdio与iostreams以及切换解析器生成器以及使用C++ flex/bison骨架(它们引入独立的头痛)并不感兴趣.
编辑:请包括支持您的答案的C++标准的那些部分的名称.
可能重复:
如何查找sizeof(指向数组的指针)
我正在学习如何在C中创建动态数组,但遇到了一个我无法弄清楚的问题.
如果我使用代码:
int num[10];
for (int i = 0; i < 10; i++) {
num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));
Run Code Online (Sandbox Code Playgroud)
我得到输出:
sizeof num = 40
sizeof num[0] = 4
Run Code Online (Sandbox Code Playgroud)
这就是我期望发生的事情.但是,如果我malloc数组的大小如下:
int *num;
num = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {
num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));
Run Code Online (Sandbox Code Playgroud)
然后我得到输出:
sizeof num = 8
sizeof num[0] = 4 …Run Code Online (Sandbox Code Playgroud) 比方说我创建了一个指针newPtr,我使用malloc(一些大小)然后我再次使用malloc(某个大小)使用相同的指针.怎么了?我在创建第二块内存与第一块相同吗?newPtr是否指向同一地址?
例:
int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = malloc(10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)