Can a pass-by-reference var be assigned to a local var?
Matthew Hagerty
matthew at mundomateo.com
Wed Jul 2 12:24:50 PDT 2003
Justin,
Yes, after reading your post, I found this:
--
Structure Assignments
ANSI C compilers allow the information in one structure to be assigned to
another structure, as in:
binfo=addr_info;
--
I never knew that. I wonder why that functionality is done for structs,
but not extended to arrays as well? Why make exceptions for structs like
that?
Thanks for clearing that up for me!
Matthew
> I think you're missing something.
>
> This is "structure assignment" in action. The variable 'sbp' is a
> *statb, and the assignment assigns a structure, sb2, to *sbp, which is
> itself a structure, not a pointer.
>
> Regards,
>
> Justin
>
> On Wednesday, July 2, 2003, at 10:54 AM, Matthew Hagerty wrote:
>
>> Greetings,
>>
>> I was looking over the code for the tail command and found something
>> that
>> seems wrong. Below is the abbreviated code that highlights my concern.
>> Basically, sb is defined in main() and passed to forward() (and
>> reverse())
>> by reference. Then in forward() sb2 is defined, and finally sb is set
>> to
>> sb2.
>>
>> Two things come to mind that don't seem right: 1. What happens to sb
>> when
>> forward() returns? It was pointing to sb2 which was a local var of
>> forward()... and 2. The assignment *sbp = sb2 happens in a loop and
>> could
>> be executed more than once, which seems to make the comparisons just
>> prior
>> to the assignment usless 2 or more loop iterations.
>>
>> Am I missing something? It seems to me that instead of *sbp = sb2, it
>> should be done with memcpy() or something? Any insight would be
>> greatly
>> appreciated.
>>
>> Thanks,
>> Matthew
>>
>>
>> In tail.c:
>>
>> int
>> main(argc, argv)
>> int argc;
>> char *argv[];
>> {
>> struct stat sb;
>> .
>> .
>> if ((fp = fopen(fname, "r")) == NULL ||
>> fstat(fileno(fp), &sb)) {
>> .
>> .
>> if (rflag)
>> reverse(fp, style, off, &sb);
>> else
>> forward(fp, style, off, &sb);
>> .
>> .
>> }
>>
>> Then in forward.c:
>>
>> void
>> forward(fp, style, off, sbp)
>> FILE *fp;
>> enum STYLE style;
>> off_t off;
>> struct stat *sbp;
>> {
>> int ch, n, kq = -1;
>> int action = USE_SLEEP;
>> struct kevent ev[2];
>> struct stat sb2;
>> struct timespec ts;
>> .
>> .
>> if (Fflag && fileno(fp) != STDIN_FILENO) {
>> while (stat(fname, &sb2) != 0)
>> /* file was rotated, wait until it reappears */
>> (void)sleep(1);
>> if (sb2.st_ino != sbp->st_ino ||
>> sb2.st_dev != sbp->st_dev ||
>> sb2.st_rdev != sbp->st_rdev ||
>> sb2.st_nlink == 0) {
>> fp = freopen(fname, "r", fp);
>> if (fp == NULL) {
>> ierr();
>> return;
>> } else {
>> *sbp = sb2;
>> action = ADD_EVENTS;
>> }
>> }
>> }
>> .
>> .
>> }
>>
>> _______________________________________________
>> freebsd-hackers at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>> To unsubscribe, send any mail to
>> "freebsd-hackers-unsubscribe at freebsd.org"
>>
>>
> --
> /~\ The ASCII Justin C. Walker, Curmudgeon-at-Large
> \ / Ribbon Campaign
> X Help cure HTML Email
> / \
>
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
More information about the freebsd-hackers
mailing list