<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.arm.com/utility/feedstylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>for(N = List-&amp;gt;Head;N;N = N-&amp;gt;Succ)</title><link>https://community.arm.com/developer/tools-software/tools/f/keil-forum/16015/for-n-list--head-n-n-n--succ</link><description> 
struct NODE{
 struct NODE Succ;
 struct NODE Prev;
};

struct LIST{
 struct NODE *Head;
 struct NODE *Tail;
 int count;
};

struct LIST *List;
struct NODE *N;

......
for(N = List-&amp;gt;Head;N;N = N-&amp;gt;Succ)
{
 ......
}
 
Compiler C51 changed value of List</description><dc:language>en-US</dc:language><generator>Telligent Community 10</generator><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/141269?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 10:14:07 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:ee241cf2-fa83-4591-8af5-915023d758c3</guid><dc:creator>John Donaldson</dc:creator><description>&lt;p&gt;&amp;quot;List is placed in XDATA because I use the large memory model&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ok, but shouldn&amp;#39;t N therefore be placed in xdata as well? Quoting from your map file above:&lt;br /&gt;
&lt;br /&gt;
02000000H   SYMBOL    XDATA    ---       List&lt;br /&gt;
00000001H   SYMBOL    DATA     ---       N&lt;br /&gt;
&lt;br /&gt;
&amp;quot;N is used in code: &amp;quot;N = List-&amp;gt;Head&amp;quot; and &amp;quot;N = N-&amp;gt;Succ&amp;quot; in the for-loop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Yes, I must have been sleeping. Again.&lt;br /&gt;
&lt;br /&gt;
I think Hans is right, the optimisation is legitimately causing this. The order of events is (pseudocode):&lt;br /&gt;
&lt;br /&gt;
List=An address;&lt;br /&gt;
N=List-&amp;gt;Head;&lt;br /&gt;
LABEL:&lt;br /&gt;
N=N-&amp;gt;Succ;&lt;br /&gt;
if(N) goto LABEL&lt;br /&gt;
&lt;br /&gt;
So, List and N can occupy the same location without anything going wrong.&lt;br /&gt;
&lt;br /&gt;
Stefan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/95689?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 08:38:41 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:c23de7fc-bc4c-4d98-bf42-0f936cbab796</guid><dc:creator>HansBernhard Broeker</dc:creator><description>&lt;p&gt;You were looking for the wrong kind of symptoms, then.&lt;br /&gt;
&lt;br /&gt;
The fact that two variables end up being placed in the same address, all by itself, tells you exactly nothing about the actual behaviour of the program.  The compiler is perfectly allowed to re-use the memory positions used for &amp;#39;List&amp;#39; to store something else in it after &amp;#39;List&amp;#39; itself is no longer used.  That&amp;#39;s what the word &amp;quot;optimization&amp;quot; in &amp;quot;optimization level 8&amp;quot; is mainly about, after all.&lt;br /&gt;
&lt;br /&gt;
Without this kind of tricks, it would be close to impossible to fit any decent-sized C program into a typical 8051 device --- there simply isn&amp;#39;t enough memory space to spare.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/137716?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 08:09:01 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:058792f9-0f9d-4bc3-89ad-6805611e92bc</guid><dc:creator>Bernhard Felkel</dc:creator><description>&lt;p&gt;List is placed in XDATA because I use the large memory model (see message)...&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&amp;quot;N is never used in the code hence it doesn&amp;#39;t matter where it is placed:&lt;br /&gt;
&amp;quot;&lt;/i&gt;&lt;br /&gt;
N is used in code: &amp;quot;N = List-&amp;gt;Head&amp;quot; and &amp;quot;N = N-&amp;gt;Succ&amp;quot; in the for-loop.&lt;br /&gt;
&lt;br /&gt;
In small model I get the following map-file:&lt;br /&gt;
&lt;pre&gt;
      VALUE       REP       CLASS    TYPE      SYMBOL NAME
      ====================================================
      ---         MODULE    ---      ---       MAIN
      01000003H   PUBLIC    CODE     ---       main

      01000003H   BLOCK     CODE     ---       LVL=0
      01000003H   BLOCK     CODE     NEAR LAB  LVL=1
      00000008H   SYMBOL    DATA     ---       List
      00000001H   SYMBOL    DATA     ---       N
      ---         BLOCKEND  ---      ---       LVL=1
      ---         BLOCKEND  ---      ---       LVL=0
&lt;/pre&gt;
N and List are still on different locations! The compiler generates code for the for-loop (optimization level 8!)&lt;br /&gt;
&lt;br /&gt;
Maybe a compiler/linker version problem?&lt;br /&gt;
&lt;br /&gt;
My versions are:&lt;br /&gt;
C51: V7.06&lt;br /&gt;
LX51: V3.58d&lt;br /&gt;
(AX51: V2.09)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/134221?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 06:11:12 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:34227199-e9d6-4927-89f2-d67faaf3532f</guid><dc:creator>John Donaldson</dc:creator><description>&lt;p&gt;I&amp;#39;m baffled as to why &amp;quot;List&amp;quot; seems to be being placed in xdata in your map file.&lt;br /&gt;
&lt;br /&gt;
If I compile this code in the small memory model, all variables are placed in DATA. List and N are placed at the same address, however I think this is because N is never used in the code hence it doesn&amp;#39;t matter where it is placed:&lt;br /&gt;
&lt;br /&gt;
struct NODE{&lt;br /&gt;
    struct NODE *Succ;&lt;br /&gt;
    struct NODE *Prev;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct LIST{&lt;br /&gt;
    struct NODE *Head;&lt;br /&gt;
    struct NODE *Tail;&lt;br /&gt;
    int count;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct LIST MyList;&lt;br /&gt;
struct NODE FirstNode;&lt;br /&gt;
struct NODE SecondNode;&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
{&lt;br /&gt;
	struct LIST *List;&lt;br /&gt;
	struct NODE *N;&lt;br /&gt;
&lt;br /&gt;
	// init nodes and list&lt;br /&gt;
	FirstNode.Succ = &amp;SecondNode;&lt;br /&gt;
	FirstNode.Prev = 0;&lt;br /&gt;
	SecondNode.Succ = 0;&lt;br /&gt;
	SecondNode.Prev = &amp;FirstNode;&lt;br /&gt;
	MyList.Head = &amp;FirstNode;&lt;br /&gt;
	MyList.Tail = &amp;SecondNode;&lt;br /&gt;
	MyList.count = 2;&lt;br /&gt;
&lt;br /&gt;
	List = &amp;MyList;&lt;br /&gt;
&lt;br /&gt;
	// loop over all nodes&lt;br /&gt;
	for(N = List-&amp;gt;Head;N;N = N-&amp;gt;Succ)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
      VALUE       REP       CLASS    TYPE      SYMBOL NAME&lt;br /&gt;
      ====================================================&lt;br /&gt;
      ---         MODULE    ---      ---       JUNK&lt;br /&gt;
      00000016H   PUBLIC    DATA     ---       SecondNode&lt;br /&gt;
      00000010H   PUBLIC    DATA     ---       FirstNode&lt;br /&gt;
      00000008H   PUBLIC    DATA     ---       MyList&lt;br /&gt;
      01000003H   PUBLIC    CODE     ---       main&lt;br /&gt;
&lt;br /&gt;
      01000003H   BLOCK     CODE     ---       LVL=0&lt;br /&gt;
      00000001H   SYMBOL    DATA     ---       List&lt;br /&gt;
      00000001H   SYMBOL    DATA     ---       N&lt;br /&gt;
      01000003H   LINE      CODE     ---       #44&lt;br /&gt;
      01000003H   LINE      CODE     ---       #45&lt;br /&gt;
      01000003H   LINE      CODE     ---       #50&lt;br /&gt;
      0100000CH   LINE      CODE     ---       #51&lt;br /&gt;
      01000015H   LINE      CODE     ---       #52&lt;br /&gt;
      0100001EH   LINE      CODE     ---       #53&lt;br /&gt;
      01000027H   LINE      CODE     ---       #54&lt;br /&gt;
      01000030H   LINE      CODE     ---       #55&lt;br /&gt;
      01000039H   LINE      CODE     ---       #56&lt;br /&gt;
      0100003FH   LINE      CODE     ---       #58&lt;br /&gt;
      01000045H   LINE      CODE     ---       #61&lt;br /&gt;
      0100004BH   LINE      CODE     ---       #62&lt;br /&gt;
      0100004BH   LINE      CODE     ---       #63&lt;br /&gt;
      0100004FH   LINE      CODE     ---       #65&lt;br /&gt;
      ---         BLOCKEND  ---      ---       LVL=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
However, if I initialise N:&lt;br /&gt;
&lt;br /&gt;
struct NODE{&lt;br /&gt;
    struct NODE *Succ;&lt;br /&gt;
    struct NODE *Prev;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct LIST{&lt;br /&gt;
    struct NODE *Head;&lt;br /&gt;
    struct NODE *Tail;&lt;br /&gt;
    int count;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct LIST MyList;&lt;br /&gt;
struct NODE FirstNode;&lt;br /&gt;
struct NODE SecondNode;&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
{&lt;br /&gt;
	struct LIST *List;&lt;br /&gt;
	struct NODE *N;&lt;br /&gt;
&lt;br /&gt;
	// init nodes and list&lt;br /&gt;
	FirstNode.Succ = &amp;SecondNode;&lt;br /&gt;
	FirstNode.Prev = 0;&lt;br /&gt;
	SecondNode.Succ = 0;&lt;br /&gt;
	SecondNode.Prev = &amp;FirstNode;&lt;br /&gt;
	MyList.Head = &amp;FirstNode;&lt;br /&gt;
	MyList.Tail = &amp;SecondNode;&lt;br /&gt;
	MyList.count = 2;&lt;br /&gt;
&lt;br /&gt;
	List = &amp;MyList;&lt;br /&gt;
	N=&amp;FirstNode;&lt;br /&gt;
	// loop over all nodes&lt;br /&gt;
	for(N = List-&amp;gt;Head;N;N = N-&amp;gt;Succ)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
      VALUE       REP       CLASS    TYPE      SYMBOL NAME&lt;br /&gt;
      ====================================================&lt;br /&gt;
      ---         MODULE    ---      ---       JUNK&lt;br /&gt;
      00000016H   PUBLIC    DATA     ---       SecondNode&lt;br /&gt;
      00000010H   PUBLIC    DATA     ---       FirstNode&lt;br /&gt;
      00000008H   PUBLIC    DATA     ---       MyList&lt;br /&gt;
      01000003H   PUBLIC    CODE     ---       main&lt;br /&gt;
&lt;br /&gt;
      01000003H   BLOCK     CODE     ---       LVL=0&lt;br /&gt;
      0000001CH   SYMBOL    DATA     ---       List&lt;br /&gt;
      00000001H   SYMBOL    DATA     ---       N&lt;br /&gt;
      01000003H   LINE      CODE     ---       #44&lt;br /&gt;
      01000003H   LINE      CODE     ---       #45&lt;br /&gt;
      01000003H   LINE      CODE     ---       #50&lt;br /&gt;
      0100000CH   LINE      CODE     ---       #51&lt;br /&gt;
      01000015H   LINE      CODE     ---       #52&lt;br /&gt;
      0100001EH   LINE      CODE     ---       #53&lt;br /&gt;
      01000027H   LINE      CODE     ---       #54&lt;br /&gt;
      01000030H   LINE      CODE     ---       #55&lt;br /&gt;
      01000039H   LINE      CODE     ---       #56&lt;br /&gt;
      0100003FH   LINE      CODE     ---       #58&lt;br /&gt;
      01000048H   LINE      CODE     ---       #59&lt;br /&gt;
      01000048H   LINE      CODE     ---       #61&lt;br /&gt;
      01000054H   LINE      CODE     ---       #62&lt;br /&gt;
      01000054H   LINE      CODE     ---       #63&lt;br /&gt;
      01000058H   LINE      CODE     ---       #65&lt;br /&gt;
      ---         BLOCKEND  ---      ---       LVL=0&lt;br /&gt;
&lt;br /&gt;
Stefan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/122081?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 05:05:09 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:e672e707-da16-47f6-a451-27d99e9a85e0</guid><dc:creator>Bernhard Felkel</dc:creator><description>&lt;p&gt;Ok, I stripped down the code: optimization level 8, large (code/data), generic 8051 device&lt;br /&gt;
&lt;pre&gt;
struct NODE{
    struct NODE *Succ;
    struct NODE *Prev;
};

struct LIST{
    struct NODE *Head;
    struct NODE *Tail;
    int count;
};

main()
{
    struct LIST *List;
    struct NODE *N;

    // loop over all nodes
    for(N = List-&amp;gt;Head;N;N = N-&amp;gt;Succ)
    {
    }
}
&lt;/pre&gt;
-&amp;gt; MAP file (looks a bit different to yours): List and N are on different memory locations.&lt;br /&gt;
&lt;pre&gt;
      VALUE       REP       CLASS    TYPE      SYMBOL NAME
      ====================================================
      ---         MODULE    ---      ---       MAIN
      0100004AH   PUBLIC    CODE     ---       main

      0100004AH   BLOCK     CODE     ---       LVL=0
      0100004AH   BLOCK     CODE     NEAR LAB  LVL=1
      02000000H   SYMBOL    XDATA    ---       List
      00000001H   SYMBOL    DATA     ---       N
      ---         BLOCKEND  ---      ---       LVL=1
      ---         BLOCKEND  ---      ---       LVL=0
&lt;/pre&gt;
Why does your main() start at C:0x0003?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/110453?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 02:17:42 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:66182123-559b-4659-b6cd-3cbc93b77784</guid><dc:creator>Mike Hwang</dc:creator><description>&lt;p&gt;I tried two different settings (using optimization level 0 and 8)under Large Memory Model,When using level 8,N and List were located in the same memory address,but when level 0,they weren&amp;#39;t.&lt;br /&gt;
Level 8:&lt;br /&gt;
&lt;pre&gt;
SYMBOL TABLE OF MODULE:  test (MAIN)

      VALUE       REP       CLASS    TYPE      SYMBOL NAME
      ====================================================
      ---         MODULE    ---      ---       MAIN
      0200000EH   PUBLIC    XDATA    ---       SecondNode
      02000006H   PUBLIC    XDATA    ---       MyList
      02000000H   PUBLIC    XDATA    ---       FirstNode
      01000003H   PUBLIC    CODE     ---       main

      01000003H   BLOCK     CODE     ---       LVL=0
      00000001H   SYMBOL    DATA     ---       List
      00000001H   SYMBOL    DATA     ---       N
      ---         BLOCKEND  ---      ---       LVL=0
&lt;/pre&gt;
Level 0:&lt;br /&gt;
&lt;pre&gt;
SYMBOL TABLE OF MODULE:  test (MAIN)

      VALUE       REP       CLASS    TYPE      SYMBOL NAME
      ====================================================
      ---         MODULE    ---      ---       MAIN
      0200000EH   PUBLIC    XDATA    ---       SecondNode
      02000006H   PUBLIC    XDATA    ---       MyList
      02000000H   PUBLIC    XDATA    ---       FirstNode
      01000003H   PUBLIC    CODE     ---       main

      01000003H   BLOCK     CODE     ---       LVL=0
      02000014H   SYMBOL    XDATA    ---       List
      02000017H   SYMBOL    XDATA    ---       N
      ---         BLOCKEND  ---      ---       LVL=0
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/95700?ContentTypeID=1</link><pubDate>Thu, 21 Aug 2003 00:57:34 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:bbed05f9-3589-438d-8f9a-6133ee8fcb02</guid><dc:creator>Bernhard Felkel</dc:creator><description>&lt;p&gt;Have you checked the memory address in the map-file??&lt;br /&gt;
&lt;br /&gt;
I tried different settings (SMALL/LARGE memory model, Optimization level 0 and 8, Linker LX51/BL51,...) but &lt;b&gt;N&lt;/b&gt; and &lt;b&gt;List&lt;/b&gt; were &lt;b&gt;NEVER&lt;/b&gt; located on the same memory address !!!!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/71744?ContentTypeID=1</link><pubDate>Wed, 20 Aug 2003 22:28:50 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:a3475b8f-acbd-41e6-8164-16d321d73303</guid><dc:creator>Mike Hwang</dc:creator><description>&lt;p&gt;I found that N and List is located in the same memory address(D:0x01) because List is no longer used after&lt;br /&gt;
&lt;pre&gt;
N = List-&amp;gt;Head
&lt;/pre&gt;
My C51 version is 7.06 and used default optimization level(8).So if I used optimization level 0 or use List after the &lt;b&gt;for&lt;/b&gt; loop body,such as&lt;br /&gt;
&lt;pre&gt;
List-Head = (void*)0;
&lt;/pre&gt;
N and List is located in different memeory space.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/95688?ContentTypeID=1</link><pubDate>Tue, 19 Aug 2003 09:17:56 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:98e8a6b2-7a37-4659-8f2a-d0f1264654b2</guid><dc:creator>HansBernhard Broeker</dc:creator><description>&lt;p&gt;&lt;i&gt;the side effect of&lt;br /&gt;
&lt;br /&gt;
N = N-&amp;gt;Succ;&lt;br /&gt;
&lt;br /&gt;
is that the compiler think about the statement as follow:&lt;br /&gt;
&lt;br /&gt;
List-&amp;gt;Head = List-&amp;gt;Head-&amp;gt;Succ;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
What on earth made you believe that? N is a &lt;b&gt;copy&lt;/b&gt; of List-&amp;gt;Head, not an alias, so further modifications to N &lt;b&gt;will not&lt;/b&gt; modify List-&amp;gt;Head at all.&lt;br /&gt;
&lt;br /&gt;
You seem to be in serious need of a re-visit to your C textbooks to understand what pointers are, and how they work.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/40726?ContentTypeID=1</link><pubDate>Tue, 19 Aug 2003 08:51:16 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:57803345-9023-4953-befa-12c81efa0948</guid><dc:creator>Bernhard Felkel</dc:creator><description>&lt;p&gt;I have tried your code with some init statements and could not find out, that the list items ((Head/Tail) get changed after loop execution - the compiler works properly.&lt;br /&gt;
&lt;br /&gt;
Maybe you have some other additional code that changes the structure elements.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
struct NODE{
    struct NODE *Succ;
    struct NODE *Prev;
};

struct LIST{
    struct NODE *Head;
    struct NODE *Tail;
    int count;
};


struct LIST MyList;
struct NODE FirstNode;
struct NODE SecondNode;


main()
{
	struct LIST *List;
	struct NODE *N;

	// init nodes and list
	FirstNode.Succ = &amp;SecondNode;
	FirstNode.Prev = 0;
	SecondNode.Succ = 0;
	SecondNode.Prev = &amp;FirstNode;
	MyList.Head = &amp;FirstNode;
	MyList.Tail = &amp;SecondNode;
	MyList.count = 2;

	List = &amp;MyList;

	// loop over all nodes
	for(N = List-&amp;gt;Head;N;N = N-&amp;gt;Succ)
	{
	}

}
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/71742?ContentTypeID=1</link><pubDate>Mon, 18 Aug 2003 20:09:11 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:36791c40-a8a7-48af-9760-0399f18ad966</guid><dc:creator>Mike Hwang</dc:creator><description>&lt;p&gt;You are right,I forgot asterisk.the orignal source code is as follow:&lt;br /&gt;
&lt;pre&gt;
struct NODE{
     struct NODE *Succ;
     struct NODE *Prev;
};
&lt;/pre&gt;
&lt;br /&gt;
the side effect of&lt;br /&gt;
&lt;pre&gt;
N = N-&amp;gt;Succ;
&lt;/pre&gt;
is that the compiler think about the statement as follow:&lt;br /&gt;
&lt;pre&gt;
List-&amp;gt;Head = List-&amp;gt;Head-&amp;gt;Succ;
&lt;/pre&gt;
because&lt;br /&gt;
&lt;pre&gt;
N = List-&amp;gt;Head;
&lt;/pre&gt;
So the original List-&amp;gt;Head lost.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/40727?ContentTypeID=1</link><pubDate>Mon, 18 Aug 2003 09:17:09 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:de3b5a94-1350-4553-b2ba-7013a72fd625</guid><dc:creator>HansBernhard Broeker</dc:creator><description>&lt;p&gt;Your report is crucially incomplete.  How do you detect that something happened to List-&amp;gt;Head?  There&amp;#39;s not even a vague hint of actual results of running this code in your posting.&lt;br /&gt;
&lt;br /&gt;
And what side effect of &lt;pre&gt;N=N-&amp;gt;Succ&lt;/pre&gt; would that be supposed to be?  Because,  by my book, there is none to be seen in there.&lt;br /&gt;
&lt;br /&gt;
And to top it all off, there&amp;#39;s a potentially fatal typo in your quoted source code snippet:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;struct NODE{
     struct NODE Succ;  // should be *Succ
     struct NODE Prev;  // should be *Prev
};
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: for(N = List-&gt;Head;N;N = N-&gt;Succ)</title><link>https://community.arm.com/thread/40729?ContentTypeID=1</link><pubDate>Mon, 18 Aug 2003 06:39:09 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:0d72a8b3-5a15-4af2-ba46-4fb0eae123d0</guid><dc:creator>Oleg Sergeev</dc:creator><description>&lt;p&gt;Hi,&lt;br /&gt;
That&amp;#39;s strange; on AmigaOS it is basic feature of doubly linked lists.  Maybe for workaround, you should create temporal pointer, something like:&lt;br /&gt;
&lt;pre&gt;
struct NODE *N, *tn;

......
for(N = List-&amp;gt;Head;N;tn = N-&amp;gt;Succ, N=tn)
&lt;/pre&gt;
Good days!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>