[英]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个字节分配空间。
出于某种原因,执行此操作时会遇到段错误。 如果有人能指出我正确的方向,我将不胜感激。
谢谢!
您已经交换了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个字节,而对于64位将是8个字节,这会引起问题。 您应该真正使用sizeof(int)
。 这也会影响16和20,您可以将它们替换为sizeof(lnode)
。 这些在编译时设置为正确的值,因此不会影响速度。
除了定义“堆栈”与堆的问题之外:为什么要在其中将int放置为char数组而不是int呢? 可以使用char数组,但是只分配而不是memcpy到相同类型的数组要容易得多,并且不易出错。
Valgrind是您进行此类调试的朋友。 我发现自己将其用作段错误和内存泄漏的标准调试工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.