-1

我正在为一个存储一些股票市场数据的类项目创建一个链接列表。我试图将一些数据存储到堆栈中,而不是分配到堆中。我正在尝试使用 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 复制到堆栈数组中,否则我 malloc 到堆中。我使用 20 和 16,因为如果我将 int 存储在堆栈中,那么我需要为结构中剩余的 16 个字节分配空间,否则我将分配 20 个字节的空间。

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

谢谢!

4

1 回答 1

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. 除了定义“堆栈”与堆的问题之外:如果将 int 放入其中,为什么要将堆栈定义为 char 数组而不是 int?可以使用 char 数组,但是只分配而不是 memcpy 到相同类型的数组要容易得多且不易出错。

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

于 2012-04-15T04:48:23.370 回答