адреса массивов и структур

Модератор: Модераторы разделов

JK_Darien
Сообщения: 20

адреса массивов и структур

Сообщение JK_Darien »

помогите, пожалуйста разобраться.
1. почему для массива, например a[10], адрес а и &а одинаковы?ведь &a - это адрес ячейки памяти, где лежит адрес первого элемента массива, а а - это адрес первого элемента массива?
2. почему так странно выделяется память для структур(см ниже)
вот программа:

Код: Выделить всё


#include<stdio.h>
#include<string.h>
#include<errno.h>
char *program_name;
int main(int argc,char **argv)
{
 program_name=argv[0];
 struct st
 {
  char a;
  char b;
  char c;
  char*d;
  char e[10];
 }st0;
 char a[10];
 printf("&a=%p,a=%p\n",&a,a);
 printf("st=%d\n",sizeof(struct st));
 printf("&st0=%p\n",&st0);
 printf("&st0.a=%p\n",&st0.a);
 printf("&st0.b=%p\n",&st0.b);
 printf("&st0.c=%p\n",&st0.c);
 printf("&st0.d=%p\n",&st0.d);
 printf("&st0.e=%p\n",&st0.e);
 printf("st0.e=%p\n",st0.e);
 return 1;
}

и рез

Код: Выделить всё

#./e
&a=0xbffff710,a=0xbffff710;            /*(к 1.)???почему одинаковы????должны же быть разные???*/
st=20
&st0=0xbffff720
&st0.a=0xbffff720
&st0.b=0xbffff721
&st0.c=0xbffff722               /*(к 2.)почему след 724, а не 723; ведь char заним 1 байт?*/
&st0.d=0xbffff724
&st0.e=0xbffff728
st0.e=0xbffff728
#

и вот рез той же самой прогр только для

Код: Выделить всё

 struct st
 {
  char a;
  char b;

  char*d;
  char e[10];
 }st0;

Код: Выделить всё

#./e
&a=0xbffff710,a=0xbffff710;            /*???почему одинаковы????должны же быть разные???*/
st=20
&st0=0xbffff720
&st0.a=0xbffff720
&st0.b=0xbffff721                   /*(к 2.)почему след 724, а не 722; ведь char заним 1 байт?*/
&st0.d=0xbffff724
&st0.e=0xbffff728
st0.e=0xbffff728
#


и для

Код: Выделить всё

 struct st
 {
  char a;
  char b;
  char c;
 char c1;
  char*d;
  char e[10];
 }st0;

Код: Выделить всё

#./e
&a=0xbffff710,a=0xbffff710;            /*(к 1.)???почему одинаковы????должны же быть разные???*/
st=20
&st0=0xbffff720
&st0.a=0xbffff720
&st0.b=0xbffff721
&st0.c=0xbffff722
&st0.c1=0xbffff723
&st0.d=0xbffff724
&st0.e=0xbffff728
st0.e=0xbffff728
#

и для

Код: Выделить всё

 struct st
 {
  char a;
  char b;
  char c;
 char c1;
 char c2;
  char*d;
  char e[10];
 }st0;

Код: Выделить всё

#./e
&a=0xbffff710,a=0xbffff710;            /*(к 1.)???почему одинаковы????должны же быть разные???*/
st=20
&st0=0xbffff720
&st0.a=0xbffff720
&st0.b=0xbffff721
&st0.c=0xbffff722
&st0.c1=0xbffff723
&st0.c2=0xbffff724           /*(к 2.)почему след 728, а не 725; ведь char заним 1 байт?*/
&st0.d=0xbffff728
&st0.e=0xbffff72c
st0.e=0xbffff72c
#

спасибо.
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: адреса массивов и структур

Сообщение aLexx programmer »

JK_Darien писал(а):
06.10.2005 21:23
2. почему так странно выделяется память для структур?

Потому что sizeof структуры должен быть кратен sizeof(int).
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: адреса массивов и структур

Сообщение JK_Darien »

а зачем?
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: адреса массивов и структур

Сообщение aLexx programmer »

JK_Darien писал(а):
06.10.2005 21:50
а зачем?

Для удобства запихивания в стек, наверное.
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: адреса массивов и структур

Сообщение JK_Darien »

а первый вопрос? ;)
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: адреса массивов и структур

Сообщение aLexx programmer »

Операция unary & применима только к обьектам, расположенным в памяти. "a", в данном случае, не лежит в памяти - это имя массива.
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: адреса массивов и структур

Сообщение JK_Darien »

Понятно.Спасибо! :)
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: адреса массивов и структур

Сообщение aLexx programmer »

Пожалуйста!
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: адреса массивов и структур

Сообщение JK_Darien »

я посмотрел в интернете еще про эту тему, и (если кто-то хочет подробнее), то вот
пояснение (с примером)(по материалам статей, приведенных ниже), которое я написал для себя

(кодировка KOI8-R)
(если кратко, то все дело в выравнивании элементов струтуры(из-за чего могут в структуре образовываться дыры), которое можно менять директивой

Код: Выделить всё

#pragma pack(n)

(или

Код: Выделить всё

#pragma pack(push,n)
...
#pragma pack(pop)

)
и вот ссылки на статьи:
основная статья, в которой описывается подобная штука
www.kalinin.ru
и еще две статьи, в которых про саму директиву #pragma pack()
docs.sun.com
и
publib.boulder.ibm.com

для aLexx programmer:
еще раз спасибо: сам бы никогда не догадался про что в интернете смотреть :)
Спасибо сказали: