home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / c / 11776 < prev    next >
Encoding:
Text File  |  1992-07-30  |  7.8 KB  |  221 lines

  1. Xref: sparky comp.lang.c:11776 comp.os.msdos.programmer:8183
  2. Newsgroups: comp.lang.c,comp.os.msdos.programmer
  3. Path: sparky!uunet!caen!uwm.edu!csd4.csd.uwm.edu!rca
  4. From: rca@csd4.csd.uwm.edu (Robert C Allender)
  5. Subject: Summary for "Is it MY problem...or Borland's?"
  6. Message-ID: <1992Jul30.195645.5294@uwm.edu>
  7. Originator: rca@csd4.csd.uwm.edu
  8. Sender: news@uwm.edu (USENET News System)
  9. Organization: Computing Services Division, University of Wisconsin - Milwaukee
  10. Date: Thu, 30 Jul 1992 19:56:45 GMT
  11. Lines: 208
  12.  
  13. ***************************************************************************
  14. *  This is a summary of the *pertinent* responses to the post: "Is it MY  *
  15. *  problem...or is it Borland's?"   Thanks to all respondents, the        *
  16. *  problem has been fixed.                                                *
  17. ***************************************************************************
  18.  
  19. First off, for those who are interested, I declared a char * in main() and  
  20. wanted to use it in several different functions as a pointer to an array.
  21. When I passed the pointer to function #1 to get the array from the keyboard,
  22. everything worked fine.  If I passed the pointer back to main(), I still had
  23. access to the array, but once I passed it to another function, the array 
  24. started to dissappear ar become filled with garbage.  Being about as novice
  25. as they get in C programming, I didn't know what was wrong, but I checked the
  26. manuals, etc.  and nothing seemed wrong with what I wrote.  
  27.  
  28. Little did I know that it WAS my problem...Here are the correct answers I got.
  29.  
  30.  
  31. From: cdsmn.mn.org!wells@uwm.UUCP (Rich Wells)
  32.  
  33. In article <1992Jul25.162844.18778@uwm.edu> you write:
  34. >I initialize a char * in main() and pass it to a function that gets a string, 
  35. >passing the address of the string back to main().  If I try to print the 
  36. >string back at main(), it works.  I pass the char * to the next function, and
  37. >I can print the string at the beginning of that function, but by the end of 
  38. >it, the string is garbage.  If I then pass the value to main() and send it to
  39. >yet aother function, the array is empty. 
  40.  
  41.  
  42. Does scrollbox() do something like this?:
  43.  
  44. char * scrollbox( ... )
  45. {
  46.    char s[SOME_SIZE];
  47.    ...
  48.    return s;
  49. }
  50.  
  51. If so, there's your problem.  You're returning the address of a
  52. local variable that no longer exists after scrollbox() returns.
  53.  
  54. The solution (if this is indeed the problem) is to either malloc
  55. some memory for the string to return, as in:
  56.  
  57.    s2 = malloc(strlen(s)+1);
  58.    strcpy(s2, s);
  59.    return s2;
  60.  
  61. in which case the caller must remember to free the memory.  Or
  62. you can supply the buffer to the scrollbox(), as in
  63.  
  64. void scrollbox( char * s, int len, ...)
  65. {
  66.    ...
  67. }
  68.  
  69. (note that you should also specify the length of the buffer, so
  70. that scrollbox() can be sure not to overwrite the end of it).
  71.  
  72. Richard Wells   wells@cdsmn.mn.org  or  ...!tcnet!cdsmn!wells
  73.  
  74. ****************************************************************************
  75.  
  76. From: Kenneth Herron <kherron@ms.uky.edu>
  77.  
  78. Your variable c is just a pointer.  You never allocate any space for
  79. it.  The space that it's pointing to is probably on the stack and so
  80. overwritten the next time you do a function call, or else a static
  81. buffer that gets used by some other function.  You probably need to
  82. modify the scrollbox() function to allocate the space using malloc(),
  83. or if it's a library function, you need to copy the strings somewhere
  84. safe when the call returns.
  85.  
  86. ****************************************************************************
  87.  
  88. From rda399k@monu6.cc.monash.edu.au Wed Jul 29 00:47:10 1992
  89.  
  90.  Hi Robert,
  91.     
  92.  I only had a brief look at your program but from what I can see
  93.  what you have done is fine, except that you forgot to reserve space
  94.  for where your pointer (char *) c points to !!
  95.  
  96.  That is unless the function make_box() returns the pointer to a
  97.  array of type char.
  98.  
  99.  What is basically happening is that the other routines are just
  100.  reserving space temporarily and using it, it just happens to be where
  101.  your pointer c points to.
  102.  
  103.  To correct the problem, try this ..
  104.  
  105.  main()
  106.  {
  107.     char drive, c[80];              // Space for 80 characters that wont get
  108.                     // written by anything else !
  109.     ..
  110.     ..
  111.  }
  112.  
  113.  *Steve*         rda399k@monu6.cc.monash.edu.au
  114.  
  115. ****************************************************************************        
  116.  
  117. From ath@linkoping.trab.se Sun Jul 26 02:10:00 1992
  118.  
  119. >I initialize a char * in main() and pass it to a function that gets a string, 
  120. >passing the address of the string back to main().
  121.  
  122. As far as I can se from the code, you don't do this. You just accept
  123. a char * as result from scrollbox().
  124.  
  125. >If I try to print the 
  126. >string back at main(), it works.  I pass the char * to the next function, and
  127. >I can print the string at the beginning of that function, but by the end of 
  128. >it, the string is garbage.
  129.  
  130. Since the code to scrollbox isn't included, I can only guess. I guess
  131. that it returns a pointer to a static char[], either in scrollbox, or
  132. in one of the routines it calls. I also guess that this array is
  133. clobbered by some later call.
  134.  
  135. This guess is easily tested by immediately copying the string returned
  136. from scroll_box to some local or malloced area, and then passing
  137. *that* to list_dir.
  138.  
  139. Anders Thulin       ath@linkoping.trab.se 
  140. Telia Research AB, Teknikringen 2B, S-583 30 Linkoping, Sweden
  141.  
  142. ****************************************************************************
  143.  
  144. From swalter@nyx.cs.du.edu Sat Jul 25 17:16:26 1992
  145.  
  146. Does scrollbox() allocate space for the pointer that's passed back?  If
  147. not, it's writing data somewhere in memory that's eventually going to be
  148. overwritten.
  149. ...
  150. My guess as to what was happening is that the pointer (uninitialized) was
  151. pointing into dataspace somewhere which, the first time it's used, would
  152. produce the array.  However, unless the space is declared "used
  153. permanently" by array declaration or callocing, it's reused when needed. 
  154. By the time you got to the next function, the same space was reclaimed for
  155. something else ... thus wiping your array.
  156.  
  157. -Scotty
  158.  
  159. *****************************************************************************
  160.  
  161. From anto@sol.acs.unt.edu Sat Jul 25 17:50:33 1992
  162.  
  163. In comp.os.msdos.programmer you write:
  164.  
  165. >[stuff deleted]
  166. >    c = scrollbox(drive,61,10);  <---- This gets a directory, etc. 
  167.  
  168. Does "scrollbox" return a ptr to an automatic (local) string or a static/
  169. heap string? If it's local then it shouldn't be used after the function it's
  170. local to terminates. If it's static, you must copy the value (not the
  171. pointer) somewhere else if you want to call the function more than once _and_
  172. keep the value. If it's a heap allocated string (allocated by malloc or calloc)
  173. then you shouldn't have this problem (unless there's another bug lurking
  174. somewhere else).
  175.  
  176. I hope this helps,
  177. Anto.
  178.  
  179. *****************************************************************************
  180.  
  181. From: raymondc@microsoft.com
  182.  
  183. I bet scrollbox() returns the address of a local variable.
  184.  
  185. *****************************************************************************
  186.  
  187. From: bangell@cs.utah.edu (bob angell)
  188.  
  189. Sounds like a problem of over-writing your memory (I didn't look too closely
  190. at your code....but did you malloc memory on the heap for this array?  or are
  191. you trusting the stack to keep track of things?  Use the heap and make sure you
  192. are keeping the memory "clean".
  193.  
  194. Hope this helps.
  195.  
  196. -Bob-
  197.  
  198. ****************************************************************************
  199.  
  200.  
  201. Thanks again to everyone who helped out!
  202.  
  203. -Rob (rca@csd4.csd.uwm.edu)
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210. --------------------------------------------------------------------------
  211. | Robert C. Allender    |  "Exactly!" said Deep Thought. "So once you do | 
  212. | rca@csd4.csd.uwm.edu  |  know what the question actually is, you'll    | 
  213. | rca@bfs.uwm.edu       |  know what the answer means."                  | 
  214. |                       |        -The Hitchhiker's Guide to the Galaxy   | 
  215. --------------------------------------------------------------------------
  216. -- 
  217.  
  218.  
  219.  
  220.  
  221.