Tag: 堆栈

基本堆栈中的内存泄漏

我正在研究一个真正简单的堆栈实现,我似乎无法弄清楚为什么我有内存泄漏。 我对代码的期望是在push()中分配了5个节点,在displayAndDestroy()中释放了5个节点。 但是Valgrind说我已经分配了6个节点的数据并且只释放了5个。我一直在盯着这个,我不确定我哪里出错了。 #include #include #include typedef struct STACK{ char data[100]; struct STACK *next; } stack; stack *push( stack *oldTop, char *data ) { stack *newTop = malloc(sizeof(stack)); newTop->next = oldTop; if(!data){ strcpy(newTop->data, newTop->next->data); } else{ strcpy(newTop->data, data); } return( newTop ); } void displayAndDestroy( stack *top ) { stack *currentTop = top; stack *temp; […]

即使它分配的内存少于ulimit限制的内存,Proc也会崩溃

我通过ulimit -s 2000设置堆栈大小为2000Kb,为硬限制设置ulimit -Ss 2000。 在下面的程序中,我已经分配了appox 2040000(510000 x 4)个字节,这个字节小于我的限制即。 2048000(2000 * 4)字节,但我看到我的程序崩溃了! 任何人都可以建议为什么会这样。 #include #include int main() { int a[510000] = {0}; a[510000] = 1; printf(“%d”, a[510000]); fflush(stdout); sleep(70); } 编辑1:崩溃不是因为数组索引超出限制,因为我尝试降低索引并仍然崩溃。 只有当我通过ulimit限制时才会发生这种情况。

返回alloca指针

此代码是否返回对堆栈上分配的变量的无效引用? 或者是什么: void *f(size_t sz) { return alloca(sz); } 或者这是一个由alloca实现/编译器支持处理的特殊情况,如f(alloca(size), alloca(size))会是什么?

在无向图中查找从一个节点到另一个节点的所有路径

所以我有一个邻接列表forms的图形,结构如下面的代码所示。 鉴于这种forms的数据结构,我想知道如何找到并打印从给定节点到另一个节点的所有可能路径。 我知道我可能不得不使用堆栈来执行DFS或队列来执行BFS,我知道该怎么做,但我对如何找到所有可能的路径感到困惑 typedef struct graph { int n, maxn; Vertex** vertices; }Graph; typedef struct vertex { char* label; Edge* first_edge; }Vertex; typedef struct edge { int u, v; int weight; Edge* next_edge; }Edge ;

您如何知道堆栈在系统中是成长还是下降?

可能重复: 堆栈增长方向 堆栈是向上还是向下增长? 大家好, 我怎样才能知道机器的堆栈是否在C内存中增长或减少。更重要的是,哪个更好:堆栈增长的系统还是堆栈增长的系统? 并将低于逻辑工作??? void sub(int *a) { int b; if (&b > a) { printf(“Stack grows up.”); } else { printf(“Stack grows down.”); } } main () { int a; sub(&a); } 我的意思是这个表达式在C中有效 if (&b > a)

c中的数组声明

可能重复: 堆栈变量与堆变量 声明数组之间的区别是: int arr[100]; 和 int* arr=(int*)malloc(sizeof(int)*100); 哪一个更受欢迎? 有没有像堆和堆栈内存这样的东西?

如何为堆栈变量分配内存?

在VS(发布)上,我运行以下命令: int main(void) { char b[] = “123”; char a[] = “1234567”; printf(“%x %x\n”, b,a); return 0; } 我可以看到,a的mem地址是b + 3(字符串的长度)。 这表明内存没有间隙。 这保证了使用最少的记忆。 所以,我现在有点相信所有编译器都会这样做。 我想在这里确定这个猜测。 有人可以给我一个更正式的证据,或者告诉我,我的猜测是根源于巧合。

循环内的堆栈分配

在C中,当你编写这样的代码时: void some_function(void) { while (something) { char buf[4096]; … } } 在调用函数时是否会发生buf的分配? 或者是否为循环的每次迭代都会进行单独的分配? 如果我把buf的声明放在循环之外(即在函数的开头),会有任何性能提升吗?

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

我正在为内存非常有限的微处理器编程设计,我必须在不同的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,…) } 我的问题是哪种方法是实现这种设计的最佳方式? 有人可以解释一下推理吗?

C堆栈使用临时结构

我使用嵌入式东西,因此,我使用特殊的C编译器C30用于MCU。 我对它与临时结构的行为感到困惑。 但是,也许我不知道什么,它的意图是什么? 考虑一下代码: typedef struct { int a; int b; } T_TestStruct1; void test1(T_TestStruct1 *p_test_struct) { /* do something */ } 这些调用test1() : void some_function() { { T_TestStruct1 par = { .a = 1, .b = 1, }; test1(&par); } { T_TestStruct1 par = { .a = 2, .b = 2, }; test1(&par); } […]