Tag:

在堆上创建结构?

我已经被指示通过在堆上创建一个String结构来编写模型strdup,它包含源的副本。 我想我已成功编写了strdup,但我不确定我是否在堆上创建了一个Struct … typedef struct String { int length; int capacity; unsigned check; char ptr[0]; } String; char* modelstrdup(char* src){ int capacity =0, length=0, i = 0 ; char *string; while ( src[length] != ‘\0’){ length++; } capacity = length; string = malloc(sizeof(String) + capacity + 1); while ( i < length ){ string[i] = […]

我应该使堆栈段大或堆段大吗?

我正在为内存非常有限的微处理器编程设计,我必须在不同的function中使用“大量”内存。 我不能有一个大的堆栈段,堆段,数据段,我必须选择哪个做大,哪个做小。 我总共大约32KB, 我使用大约20KB的文本段,其余为12KB。 我需要一个4KB的缓冲区来传递给不同的函数(SPI Flash扇区大小)。 应该在哪里初始化那个大缓冲区? 所以我的选择是: 1)如果我在函数的开头声明缓冲区,则需要使堆栈变大 spiflash_read(…) { u8 buffer[4096]; // allocated on stack syscall_read_spi(buffer,…) } 2)动态分配,堆需要变大 spiflash_read(…) { u8 *buffer = (u8*) malloc(4096); // allocated in heap syscall_read_spi(buffer,…) } 3)静态分配,巨大的下方不能在“SPI库”之外使用。 static u8 buffer[4096]; // allocated in data section. spiflash_read(…) { syscall_read_spi(buffer,…) } 我的问题是哪种方法是实现这种设计的最佳方式? 有人可以解释一下推理吗?

关于读/写速度的堆与堆栈

我刚刚在Stack Overflow(以及通过Google找到的其他随机站点)上经历了一堆堆栈与堆线程,但我找不到能够为读/写速度问题提供更多(如果有的话)深度的答案(大多数答案和文章都关注分配速度)。 如果我正在编写一个C程序(在我的情况下,一个游戏),我将对象数据存储在一个几千字节的缓冲区中,如果分配了该缓冲区,它是否会产生差异(就访问速度而言)在堆栈上还是在堆上? 或者,在决定存储它的硬件(即缓存或RAM)的位置时,编译器是否会以相同的方式处理该大小的缓冲区?

getaddrinfo addrinfo导致堆栈或堆

至少我有点困惑。 getaddrinfo()调用’updates’指向addrinfo结构的指针,当我要在相同的范围(该函数)中使用addrinfo时,一切都很好但是如果我将结构复制到另一个(通过分配它)会发生什么。 请帮助我理解正在进行的基础知识(不寻求替代方法的建议)。 如果我错了,请纠正我:a)getaddrinfo()需要指向addrinfo的struct-pointer的指针。 b)getaddrinfo在当前函数作用域中创建addrinfo结构并更新a)中所需的指针 现在我真正的问题是:我想将addrinfo存储在其他地方。 使用分配给另一个指针不会执行深层复制,并且在该函数之后所有指针都变为无效? 最好给出一个非常简单的例子: void GetAddrInfo(struct addrinfo *update) { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); //is this save? After this ‘scope’ ends all pointed fields are invalid? //this doesn’t copy the linked list ai_next. *update=*res; } 直接使用和更新getaddrinfo似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁。 任何人都可以在这里给我更多的见解(请解释在哪里创建的内容和销毁位置,堆栈,堆欢迎所有信息)

为什么全局变量存储在堆中?

为什么在以下示例中,全局变量存储在堆段中,而不是数据/ bss段? 从map伪文件的以下输出中,data / bss段是第3行。 这是因为它是读/写和匿名的。 以下2个条目是堆(如标签所示)。 这是/ proc // maps的输出: 00400000-00405000 r-xp 00000000 08:02 17962770 myexec 00604000-00605000 r–p 00004000 08:02 17962770 myexec 00605000-00606000 rw-p 00005000 08:02 17962770 myexec 00606000-00607000 rw-p 00000000 00:00 0 [heap] 00607000-00642000 rw-p 00000000 00:00 0 [heap] 7ffff7a15000-7ffff7bd0000 r-xp 00000000 08:02 22282470 ..libc2.19.so 7ffff7bd0000-7ffff7dcf000 —p 001bb000 08:02 22282470 ..libc-.19.so 7ffff7dcf000-7ffff7dd3000 r–p […]

是否可以(重新)将数组的所有值设置在一行中(在初始化之后)?

在C中,我知道我可以制作这样的数组 int myarray[5] = {a,b,c,d,e}; 但是,想象一下这个数组已经初始化了 int myarray[5]; 然后在某个时刻,我想设置/改变所有的值而不去 myarray[0] = a; myarray[1] = b; myarray[2] = c; myarray[3] = d; myarray[4] = e; 而是更喜欢的东西 myarray = {a,b,c,d,e}; 我问这个的原因是因为如果我在堆上声明我的数组,我将初始化数组,如: int* myarray = malloc(5*sizeof(int)); 然后我希望能够在一行中输入所有值(主要是为了让我的代码看起来更干净)

仅使用堆区域的递归

是否只使用堆区域进行递归示例?

malloc()的奇怪行为

试着理解我的问题的答案 尝试释放堆管理器分配的内存时会发生什么,分配的内容超过了要求? 我写了这个函数,并对其输出感到困惑 int main(int argc,char **argv){ char *p,*q; p=malloc(1); strcpy(p,”01234556789abcdefghijklmnopqrstuvwxyz”); //since malloc allocates atleast 1 byte q=malloc(2); // free(q); printf(“q=%s\n”,q); printf(“p=%s\n”,p); return 0; } 产量 q=vwxyz p=01234556789abcdefghijklm! 任何人都可以解释这种行为吗? 或者这个实现是否具体? 如果free(q)被取消注释,我也会收到SIGABRT。

如何使用gdb来探索堆栈/堆?

有谁能请给我一个快速概述/指向我检查C程序的堆栈(和堆?)的方法的文档? 我认为这应该用GDB来完成,但是如果还有其他更直接的选择,那么这应该没问题。 谢谢。

“CRT检测到应用程序在堆缓冲区结束后写入内存”是什么意思?

我在使用此代码时遇到问题。 它在free(q-> izv)函数中断,我得到一个调试错误说: CRT detected that the application wrote to memory after end of heap buffer 我不知道这意味着什么,所以我会感激我得到的任何帮助。 typedef struct izvodjaci{ char *izv; int broj; struct izvodjaci *sled; }IZV; obrisi_i(IZV *p){ while (p){ IZV *q; q = p; p = p->sled; if (!strcmp(q->izv,”UNKNOWN”)) free(q->izv); free(q); } } 提前致谢