【问题标题】:Linked List in Contiguous Memory Space连续内存空间中的链表
【发布时间】:2014-03-02 19:37:14
【问题描述】:

我一直在研究一些用于测量延迟的代码,并且我遇到的一种方法是通过一个限制在动态分配的内存空间中的链表进行迭代。我非常了解传统的链表,并且我了解动态分配的数组,但是将两者放在一起会让我陷入循环。这似乎是一个相对基本的问题,但我对 c 不是很好,无论出于何种原因,我都很难构建它。

我想跨越 128 个字节,所以我尝试执行以下操作(我知道我可能离基地很远,但我需要从某个地方开始)

char** randomArray = malloc(accessSize);    //allocate space for linked list
char** start=randomArray;               //header for base adress
char** iterate;                         //iterator
char** end =randomArray+accessSize;     //end address
for(iterate=start; iterate < end; iterate+=128){
    *iterate = iterate+128;                 //step through in strides of 128 bytes, assign next addr to current value
}

*iterate=start;     //linked list is circular, assign last element to first

我不知道要指向什么数据类型,通常你为结构分配空间,但该空间已经存在。

然后我想我会按如下方式遍历它

for(counter = 0; counter < LotsOfAccess; counter++){
     start = (char**) *start;
}

嗯,这对我来说甚至没有一点作用,我似乎无法找出原因。有没有人对正确的实施方式或我可能做错了什么有任何建议?

【问题讨论】:

  • 如何思考:不是对每个列表项使用 malloc,而是使用自己的自定义分配器。此自定义分配器将从数组中分配项目(列表条目)。数组中的每一项(在本例中)为 128 个字节。换句话说,如果你知道如何用 malloc 解决这个问题,只需将 malloc 替换为 my_malloc 即可。
  • @jdigital 不,每个项目都不是 128 字节。每个块都是128 * sizeof(char*),所以除非你的指针每个都是 1 字节(它们不是),否则段不是 128 字节长。
  • @WhozCraig 使项目大小随心所欲,128 * sizeof(char *) 可以满足您的需求。你在读代码,我在读英文;-)

标签: c arrays dynamic linked-list


【解决方案1】:

好吧,这个问题并没有引起很多人的注意,但我仍然认为这是一个有用的问题,所以我会发布我所做的!

为了在动态分配的空间中创建跨度为 128 字节的链表,我做了:

char * randomArray = malloc(accessSize*sizeof(char));
int counter;
char ** head = (char **) randomArray;
char ** iterate = head;
for(counter=0; counter < accessSize; counter+=128){
    (*iterate) = &randomArray[counter+128];
    iterate+=(128/sizeof iterate);
}
*iterate = head;

遍历我做了:

iterate = head;   
for(counter=0; counter < NUM_ACCESSES; counter++){
    iterate = *iterate;
}

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 2014-09-29
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多