1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
4
5Permission is granted to copy, distribute and/or modify this document
6under the terms of the GNU Free Documentation License, Version 1.3 or
7any later version published by the Free Software Foundation; with the
8Invariant Sections being "Free Software" and "Free Software Needs
9Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
10and with the Back-Cover Texts as in (a) below.
11
12(a) The FSF's Back-Cover Text is: "You are free to copy and modify
13this GNU Manual.  Buying copies from GNU Press supports the FSF in
14developing GNU and promoting software freedom." -->
15<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
16<head>
17<title>Debugging with GDB: Arrays</title>
18
19<meta name="description" content="Debugging with GDB: Arrays">
20<meta name="keywords" content="Debugging with GDB: Arrays">
21<meta name="resource-type" content="document">
22<meta name="distribution" content="global">
23<meta name="Generator" content="makeinfo">
24<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
25<link href="index.html#Top" rel="start" title="Top">
26<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
27<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
28<link href="Data.html#Data" rel="up" title="Data">
29<link href="Output-Formats.html#Output-Formats" rel="next" title="Output Formats">
30<link href="Variables.html#Variables" rel="previous" title="Variables">
31<style type="text/css">
32<!--
33a.summary-letter {text-decoration: none}
34blockquote.smallquotation {font-size: smaller}
35div.display {margin-left: 3.2em}
36div.example {margin-left: 3.2em}
37div.indentedblock {margin-left: 3.2em}
38div.lisp {margin-left: 3.2em}
39div.smalldisplay {margin-left: 3.2em}
40div.smallexample {margin-left: 3.2em}
41div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
42div.smalllisp {margin-left: 3.2em}
43kbd {font-style:oblique}
44pre.display {font-family: inherit}
45pre.format {font-family: inherit}
46pre.menu-comment {font-family: serif}
47pre.menu-preformatted {font-family: serif}
48pre.smalldisplay {font-family: inherit; font-size: smaller}
49pre.smallexample {font-size: smaller}
50pre.smallformat {font-family: inherit; font-size: smaller}
51pre.smalllisp {font-size: smaller}
52span.nocodebreak {white-space:nowrap}
53span.nolinebreak {white-space:nowrap}
54span.roman {font-family:serif; font-weight:normal}
55span.sansserif {font-family:sans-serif; font-weight:normal}
56ul.no-bullet {list-style: none}
57-->
58</style>
59
60
61</head>
62
63<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
64<a name="Arrays"></a>
65<div class="header">
66<p>
67Next: <a href="Output-Formats.html#Output-Formats" accesskey="n" rel="next">Output Formats</a>, Previous: <a href="Variables.html#Variables" accesskey="p" rel="previous">Variables</a>, Up: <a href="Data.html#Data" accesskey="u" rel="up">Data</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
68</div>
69<hr>
70<a name="Artificial-Arrays"></a>
71<h3 class="section">10.4 Artificial Arrays</h3>
72
73<a name="index-artificial-array"></a>
74<a name="index-arrays"></a>
75<a name="index-_0040_002c-referencing-memory-as-an-array"></a>
76<p>It is often useful to print out several successive objects of the
77same type in memory; a section of an array, or an array of
78dynamically determined size for which only a pointer exists in the
79program.
80</p>
81<p>You can do this by referring to a contiguous span of memory as an
82<em>artificial array</em>, using the binary operator &lsquo;<samp>@</samp>&rsquo;.  The left
83operand of &lsquo;<samp>@</samp>&rsquo; should be the first element of the desired array
84and be an individual object.  The right operand should be the desired length
85of the array.  The result is an array value whose elements are all of
86the type of the left argument.  The first element is actually the left
87argument; the second element comes from bytes of memory immediately
88following those that hold the first element, and so on.  Here is an
89example.  If a program says
90</p>
91<div class="smallexample">
92<pre class="smallexample">int *array = (int *) malloc (len * sizeof (int));
93</pre></div>
94
95<p>you can print the contents of <code>array</code> with
96</p>
97<div class="smallexample">
98<pre class="smallexample">p *array@len
99</pre></div>
100
101<p>The left operand of &lsquo;<samp>@</samp>&rsquo; must reside in memory.  Array values made
102with &lsquo;<samp>@</samp>&rsquo; in this way behave just like other arrays in terms of
103subscripting, and are coerced to pointers when used in expressions.
104Artificial arrays most often appear in expressions via the value history
105(see <a href="Value-History.html#Value-History">Value History</a>), after printing one out.
106</p>
107<p>Another way to create an artificial array is to use a cast.
108This re-interprets a value as if it were an array.
109The value need not be in memory:
110</p><div class="smallexample">
111<pre class="smallexample">(gdb) p/x (short[2])0x12345678
112$1 = {0x1234, 0x5678}
113</pre></div>
114
115<p>As a convenience, if you leave the array length out (as in
116&lsquo;<samp>(<var>type</var>[])<var>value</var></samp>&rsquo;) <small>GDB</small> calculates the size to fill
117the value (as &lsquo;<samp>sizeof(<var>value</var>)/sizeof(<var>type</var>)</samp>&rsquo;:
118</p><div class="smallexample">
119<pre class="smallexample">(gdb) p/x (short[])0x12345678
120$2 = {0x1234, 0x5678}
121</pre></div>
122
123<p>Sometimes the artificial array mechanism is not quite enough; in
124moderately complex data structures, the elements of interest may not
125actually be adjacent&mdash;for example, if you are interested in the values
126of pointers in an array.  One useful work-around in this situation is
127to use a convenience variable (see <a href="Convenience-Vars.html#Convenience-Vars">Convenience
128Variables</a>) as a counter in an expression that prints the first
129interesting value, and then repeat that expression via <tt class="key">RET</tt>.  For
130instance, suppose you have an array <code>dtab</code> of pointers to
131structures, and you are interested in the values of a field <code>fv</code>
132in each structure.  Here is an example of what you might type:
133</p>
134<div class="smallexample">
135<pre class="smallexample">set $i = 0
136p dtab[$i++]-&gt;fv
137<span class="key">RET</span>
138<span class="key">RET</span>
139&hellip;
140</pre></div>
141
142<hr>
143<div class="header">
144<p>
145Next: <a href="Output-Formats.html#Output-Formats" accesskey="n" rel="next">Output Formats</a>, Previous: <a href="Variables.html#Variables" accesskey="p" rel="previous">Variables</a>, Up: <a href="Data.html#Data" accesskey="u" rel="up">Data</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
146</div>
147
148
149
150</body>
151</html>
152