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

时间:2012-04-15 02:55:23

标签: c stack malloc heap

我正在为存储一些股票市场数据的类项目创建一个链表。我试图将一些数据存储到堆栈而不是mallocing到堆。我想用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函数,我需要为它设置malloc空间。

如果堆栈数组中仍有空间,我将int复制到堆栈数组中,否则我将malloc插入堆中。我使用20和16,因为如果我将int存储在堆栈中,那么我需要malloc空间用于我的struct中的剩余16个字节,否则我的malloc空间为20个字节。

出于某种原因,当我这样做时,我会遇到段错误。如果有人能指出我正确的方向,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:3)

  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个字节,但是例如8为64位,这会导致问题。你应该真的使用sizeof(int)。这也会影响16和20,您可以用sizeof(lnode)替换它。这些在编译时设置为正确的值,因此不会影响速度。

  3. 除了定义“堆栈”与堆的问题之外:为什么要将堆栈定义为char数组而不是int,如果你在那里放入int?可以使用一个char数组,但是它只是为同一类型的数组分配而不是memcpy更容易且更不容易出错。

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