C语言 使用 memcpy 而不是错误定位将空间存储到堆栈中



我正在为一个存储一些股票市场数据的类项目创建一个链表。我试图将一些数据存储到堆栈上,而不是错误地定位到堆上。我正在尝试使用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 个字节提供 malloc 空间,否则我会为 20 个字节 malloc 空间。

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

谢谢!

  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 数组,但将 memcpy 分配给相同类型的数组要容易得多,也更不容易出错。

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

最新更新