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> [<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 ‘<samp>@</samp>’. The left 83operand of ‘<samp>@</samp>’ 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 ‘<samp>@</samp>’ must reside in memory. Array values made 102with ‘<samp>@</samp>’ 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‘<samp>(<var>type</var>[])<var>value</var></samp>’) <small>GDB</small> calculates the size to fill 117the value (as ‘<samp>sizeof(<var>value</var>)/sizeof(<var>type</var>)</samp>’: 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—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++]->fv 137<span class="key">RET</span> 138<span class="key">RET</span> 139… 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> [<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