我正在为存储一些股票市场数据的类项目创建一个链表。我试图将一些数据存储到堆栈而不是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个字节。
出于某种原因,当我这样做时,我会遇到段错误。如果有人能指出我正确的方向,我将不胜感激。
谢谢!
答案 0 :(得分:3)
你已经交换了你的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)
替换它。这些在编译时设置为正确的值,因此不会影响速度。
除了定义“堆栈”与堆的问题之外:为什么要将堆栈定义为char数组而不是int,如果你在那里放入int?可以使用一个char数组,但是它只是为同一类型的数组分配而不是memcpy更容易且更不容易出错。
Valgrind是您进行此类调试的朋友。我发现自己将它用作段错误和内存泄漏的标准调试工具。