[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
- <!--x-content-type: text/plain -->
- <!--x-date: Sun Jan 25 12:41:31 2004 -->
- <!--x-from-r13: wxancxn ng xarheb.arg (Xbr Yancxn) -->
- <!--x-message-id: [email protected] -->
- <!--x-reference: [email protected] --> "http://www.w3.org/TR/html4/loose.dtd">
- <!--x-subject: [ale] Any C Gurus Out There -->
- <li><em>date</em>: Sun Jan 25 12:41:31 2004</li>
- <li><em>from</em>: jknapka at kneuro.net (Joe Knapka)</li>
- <li><em>in-reply-to</em>: <<a href="msg01022.html">[email protected]</a>></li>
- <li><em>references</em>: <<a href="msg01022.html">[email protected]</a>></li>
- <li><em>subject</em>: [ale] Any C Gurus Out There</li>
> Hello,
>
> I have a C question. I am experiementing with pointers. I want to be able to
> dynamically allocate a three dimensional array (a table of strings) and I
> want to be able to be able to allocate all the parts of the array using
> pointers. Yes, I know I can use subscripts and yes, I know that would be
> easier to read; but, I just want to be "able" to do it. Here's what I've
> discovvered so far:
> char ***threeD;
> threeD = (char ***) calloc (2, sizeof (char **));
>
> This line works, and allocates space for two rows. I know tthat it works
> because I have used subscripts to allocate, populate and print the contents
> of the array.
>
> I have a pointer row3d defined as:
> char ***row3d;
> row3d = threeD;
> *row3d++ = (char **) calloc (5, sizeof (char *));
> *row3d = (char **) calloc (5, sizeof (char *));
>
> This allocates memory for the two rows and apparently is equivalent to:
> threeD[0] = (char **) calloc (5, sizeof (char *));
> threeD[1] = (char **) calloc (5, sizeof (char *));
>
> This is where the problem starts. I have a pointer defined as:
> char ***row0col;
> row0col = threeD;
>
> I want to use row0col to allocate memory for each column in row 0 and copy a
> string to that address. I thought this would work:
> **row0col = (char *) calloc (20, sizeof (char));
> strcpy (**row0col, "row:0;col:0");
> *(*row0col)++;
According to K&R2, that last line is equivalent to *((*row0col)++),
so you're incrementing *row0col after returning the value stored
there. Is that what you intended?
Rephrasing your code:
Let's see. Assuming your array is in row-major order (that is, the
char**'s pointed at by row0col represent the rows, and the char*'s
pointed at by each of those represent the columns:
row0col is a pointer to a row, so incrementing it takes us
to the next row.
*row0col is a pointer to a column, so incrementing it takes
us to the next column.
**row0col is a char* representing an entry in the array;
incrementing it takes us to the next character in the entry,
which is not very useful right now.
#include <stdio.h>
int main(int argc,char* argv[]) {
// Allocate the rows.
#define NROWS 2
char*** array = (char***)malloc(NROWS*sizeof(char**));
char*** row = array;
int ii,jj;
// Allocate the columns.
#define NCOLS 5
for (ii=0; ii<NROWS; ++ii) {
*row = (char**)malloc(NCOLS*sizeof(char*));
++row; // Easier to see what's going on by incrementing separately, IMO.
}
// Allocate and fill the individual entries.
row = array;
for (ii=0; ii<NROWS; ++ii) {
char** col = *row;
for (jj=0; jj<NCOLS; ++jj) {
*col = (char*)malloc(20);
strcpy(*col,"This is a string");
++col;
}
++row;
}
// Read them back out.
row = array;
for (ii=0; ii<NROWS; ++ii) {
char** col = *row;
for (jj=0; jj<NCOLS; ++jj) {
puts(*col);
++col;
}
++row;
}
}
The code above is typical for me: not as small is it could be, but I
can usually figure out what is was supposed to do years later, with
not too much head-scratching :-)
> But, it doesn't. The first element, column 0, gets copied correctly but I am
> unable to get the pointer to increment correctly so I can allocate a new
> block of memory for the next string in column 1; I have tried many different
> pointer incrementation schemes other that the above. Most don't increment it
> at all. The ones that do, apparently by viewing through gdb, either increment
> the address to the next character in row 0 column 0 or increment the entire
> row.
>
> I can do all of this with subscripts and it works fine. I just can't figure
> out the pointer equivalent to threeD[y][x] and how to increment that with
> pointer arithmetic. If anyone has a clue on this, I would appreciate your
> insight. I'm sure others would as well.
I think you'll find that most experienced C programmers would just
use array syntax for this kind of thing; it's way simpler.
HTH,
-- Joe Knapka
--
(let ((antichrist 'me) (anarchist 'me))) -- the sexp-pistols.
If you really want to get my attention, don't reply to this;
instead, send mail to "jknapka .at. kneuro .dot. net."
</pre>
<!--X-Body-of-Message-End-->
<!--X-MsgBody-End-->
<!--X-Follow-Ups-->
<hr>
<ul><li><strong>Follow-Ups</strong>:
<ul>
<li><strong><a name="01033" href="msg01033.html">[ale] Any C Gurus Out There</a></strong>
<ul><li><em>From:</em> terry at esc1.com (Terry Lee Tucker)</li></ul></li>
</ul></li></ul>
<!--X-Follow-Ups-End-->
<!--X-References-->
<ul><li><strong>References</strong>:
<ul>
<li><strong><a name="01022" href="msg01022.html">[ale] Any C Gurus Out There</a></strong>
<ul><li><em>From:</em> terry at esc1.com (Terry Lee Tucker)</li></ul></li>
</ul></li></ul>
<!--X-References-End-->
<!--X-BotPNI-->
<ul>
<li>Prev by Date:
<strong><a href="msg01027.html">more on -> Re: [ale] segmentation fault.............</a></strong>
</li>
<li>Next by Date:
<strong><a href="msg01029.html">[ale] Linux Provisioning</a></strong>
</li>
<li>Previous by thread:
<strong><a href="msg01022.html">[ale] Any C Gurus Out There</a></strong>
</li>
<li>Next by thread:
<strong><a href="msg01033.html">[ale] Any C Gurus Out There</a></strong>
</li>
<li>Index(es):
<ul>
<li><a href="maillist.html#01028"><strong>Date</strong></a></li>
<li><a href="threads.html#01028"><strong>Thread</strong></a></li>
</ul>
</li>
</ul>
<!--X-BotPNI-End-->
<!--X-User-Footer-->
<!--X-User-Footer-End-->
</body>
</html>