Path: csiph.com!usenet.pasdenom.info!aioe.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed1a.news.xs4all.nl!xs4all!newsgate.cistron.nl!newsgate.news.xs4all.nl!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.001 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'python,': 0.02; 'subject:Python': 0.06; 'alignment': 0.07; 'compiler': 0.07; 'element': 0.07; 'padding': 0.07; 'integers': 0.09; 'mess': 0.09; 'subject:into': 0.09; 'cc:addr:python-list': 0.11; '(int': 0.16; 'from:addr:rosuav': 0.16; 'from:name:chris angelico': 0.16; 'instance:': 0.16; 'invisible': 0.16; 'objects.': 0.16; 'pairs': 0.16; 'pointer,': 0.16; 'pointers,': 0.16; 'right;': 0.16; 'subject:variable': 0.16; 'typedef': 0.16; 'value;': 0.16; 'elements': 0.16; 'wrote:': 0.18; 'written': 0.21; 'feb': 0.22; 'cc:addr:python.org': 0.22; 'print': 0.22; 'pointer': 0.24; 'cc:2**0': 0.24; "i've": 0.25; 'possibly': 0.26; 'header:In-Reply- To:1': 0.27; 'am,': 0.29; 'array': 0.29; 'message- id:@mail.gmail.com': 0.30; 'code': 0.31; '25,': 0.31; 'piece': 0.31; 'struct': 0.31; 'problem': 0.35; 'something': 0.35; 'no,': 0.35; 'but': 0.35; 'received:google.com': 0.35; 'there': 0.35; 'really': 0.36; 'possible': 0.36; 'subject:?': 0.36; 'members.': 0.37; 'two': 0.37; 'same.': 0.38; 'skip:& 20': 0.39; 'itself': 0.39; 'structure': 0.39; 'subject:Can': 0.60; 'skip:* 10': 0.61; 'simply': 0.61; 'first': 0.61; 'skip:n 10': 0.64; 'between': 0.67; 'anything.': 0.68; 'counts': 0.83; 'laid': 0.84; 'naughty': 0.84; 'demand': 0.91; 'to:none': 0.92 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:cc :content-type; bh=Ue/5K1XW+1FWU3yRgtGbgelyZUE25cZZeQ8enD0o2L4=; b=o6C4U4hd9KkLMRYb4NgutF1RwRSBTWYXc9ZhQkrsHI7EBj4/UMD+PS+HRX8Hgb/yF/ KTjogt1mg9w4g5WQmTzq/pXyzjNv1D7mZl6sgYZjEa+hu31wJdEtzzLPSjhTMwcnyANP dKi1/AoSLGJhnhip8+/Vt8aYiWBukCcVaZqTl7Jqj39sYv/Z/qi6YFvdzHq/OtNNKPyM oTlxQjDD6PtNtIfurwwuTzkDCGSJrA+YwDevPDj2fzyz1ymfHmYCng8A96P05VbGkQpU GXL40NClAQeDXuaHKdfhF2rt1RVAb+HRll4UbHaTnWYsY6NlP2IXgm+12mOG9Iwzxkm3 qsPA== MIME-Version: 1.0 X-Received: by 10.68.98.3 with SMTP id ee3mr1194738pbb.31.1393266145666; Mon, 24 Feb 2014 10:22:25 -0800 (PST) In-Reply-To: <08aa32de-cd51-4888-bd60-2c2b53d86ecc@googlegroups.com> References: <27ac2248-0ca3-4ba6-9d25-eaad324bc5e9@googlegroups.com> <87sird7wuw.fsf@handshake.de> <8454E8CB-E6E3-452F-8E54-9A77BFF34EC2@gmail.com> <1m3gg9lbf2ln5m2kbki954t17mqni3b20k@4ax.com> <53095145$0$29985$c3e8da3$5496439d@news.astraweb.com> <877g8mcg1m.fsf@elektro.pacujo.net> <87ob1yay9m.fsf@elektro.pacujo.net> <08aa32de-cd51-4888-bd60-2c2b53d86ecc@googlegroups.com> Date: Tue, 25 Feb 2014 05:22:25 +1100 Subject: Re: Can global variable be passed into Python function? From: Chris Angelico Cc: "python-list@python.org" Content-Type: text/plain; charset=UTF-8 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 48 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1393266155 news.xs4all.nl 2931 [2001:888:2000:d::a6]:41029 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:66991 On Tue, Feb 25, 2014 at 5:05 AM, wrote: > typedef struct { > int value; > } Number; > > Number *o; > o = malloc(sizeof(*o)); > o->value=3; > printf("o<%p>, o->value<%p>\n", o, &o->value); > > o<0x9fe5008>, o->value<0x9fe5008> > > Is the compiler borked? No, because a structure in C is simply a laying-out of its members. A pointer to the structure is exactly the same as a pointer to its first member, same as a pointer to an array is really just a pointer to its first element (with other elements laid out sequentially, possibly with padding for alignment). In Python, a complex object is a thing in its own right; it has an identity and a set of members, each of which has its own identity. In C, the structure is an invisible piece of nothingness that surrounds an aggregation of other objects. For instance: typedef struct { int val1; int val2; } NumberPair; NumberPair five_pairs[5]; int *ten_ints = (int *)five_pairs; This is considered naughty (pointer aliasing), and can make a mess of optimization, but as far as I know, it's never going to be a problem (I don't think it's possible for there to be any padding between two ints; it's possible the struct will demand coarser alignment than the ints would, which is why I've written them in that order). You can access ten integers from the aliased pointer, and five pairs of integers through the original structure array, and they're all exactly the same. If you print out those two pointers, they will have the same value in them, and &five_pairs[3]->val2 will be the same as &ten_ints[7] (and the same as ten_ints+7). For in C, neither the structure nor the non-structure is anything. The only thing that counts is code expressing itself through love. (Galatians 5:6, K&R translation. Or something like that.) ChrisA