我正在为一个存储一些股票市场数据的类项目创建一个链表。我试图将一些数据存储到堆栈上,而不是错误地定位到堆上。我正在尝试使用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 空间。
出于某种原因,当我这样做时,我得到了一个段错误。如果有人能指出我正确的方向,我将不胜感激。
谢谢!
-
你已经交换了你的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.
-
如果您针对 32 位 x86 以外的任何内容进行编译,则整数和指针将不是 4 个字节,而是 8 位的 64 位,这会导致问题。你真的应该使用
sizeof(int)
.这也会影响 16 和 20,您可能可以用sizeof(lnode)
替换它们。这些值在编译时设置为正确的值,因此不会影响速度。 -
除了定义"堆栈"与堆的问题之外:如果你把整数放在那里,为什么你要把你的堆栈定义为一个字符数组而不是 int?可以使用 char 数组,但将 memcpy 分配给相同类型的数组要容易得多,也更不容易出错。
-
Valgrind 是你进行这种调试的朋友。我发现自己将其用作段错误和内存泄漏的标准调试工具。