繁体   English   中英

使用memcpy而不是malloc将空间存储到堆栈中

[英]Storing space into stack using memcpy instead of mallocing

我正在为一个存储一些股市数据的类项目创建一个链接列表。 我试图将一些数据存储到堆栈上,而不是malloc到堆上。 我正在尝试使用memcpy做到这一点。 我的代码是这样的:

struct trade{

int a,b;
float c;
struct trade *n;
};
char stack[100];
int i = 0;

void newNode(struct trade **head, int a, int b, float c){
 struct trade *node;
 if(i<99){
  memcpy(&a,&stack[i],4);
  i = i + 4;
  node = (struct lnode*) malloc(16);
 }

  else 
   node = (struct lnode*) malloc(20);
}
.....
.....
}

每当我创建新节点并需要为其分配空间时,都会调用newnode函数。

如果堆栈数组中仍有空间,则将int复制到堆栈数组中,否则我将内存分配到堆中。 我使用20和16,因为如果我将int存储在堆栈中,则需要为结构中剩余的16个字节分配空间,否则我为20个字节分配空间。

出于某种原因,执行此操作时会遇到段错误。 如果有人能指出我正确的方向,我将不胜感激。

谢谢!

  1. 您已经交换了memcpy参数。 目标应该是第一个参数:

     memcpy(&stack[i],&a,4); 

    从联机帮助页:

     SYNOPSIS void * memcpy(void *restrict s1, const void *restrict s2, size_t n); DESCRIPTION The memcpy() function copies n bytes from memory area s2 to memory area s1. If s1 and s2 overlap, behavior is undefined. Applications in which s1 and s2 might overlap should use memmove(3) instead. 
  2. 如果您要编译除32位x86以外的任何内容,则整数和指针将不是4个字节,而对于64位将是8个字节,这会引起问题。 您应该真正使用sizeof(int) 这也会影响16和20,您可以将它们替换为sizeof(lnode) 这些在编译时设置为正确的值,因此不会影响速度。

  3. 除了定义“堆栈”与堆的问题之外:为什么要在其中将int放置为char数组而不是int呢? 可以使用char数组,但是只分配而不是memcpy到相同类型的数组要容易得多,并且不易出错。

  4. Valgrind是您进行此类调试的朋友。 我发现自己将其用作段错误和内存泄漏的标准调试工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM