sizeof () двумерного массива charecter показывает неправильные o / p - PullRequest
0 голосов
/ 20 марта 2012

Эта программа показывает только один вывод "Hiii", если размер массива слов не передан из основной функции.
Если размер генерируется внутри disp, функция показывает
Размер: 48
Размер: 2
Хиии

Если размер передается из main, функция показывает
Размер: 48
Размер: 48
Hiii
Привет
Привет
Привет, мир

#include<stdio.h>
#include<conio.h>

void disp(char words[][12],int size)
{
 int i,j;
 char *p,*cp;
 p=words;
 size=sizeof(words);
 printf("Size %d\n",size);
 for(cp=p;cp<(p+size);cp+=12)
 {
  printf("%s",cp);
  printf("\n");
 }
}

void main()
{
 char words[][12]={"Hiii","Hello","Hello There","Hello World"};
 int size;
 clrscr();
 size=sizeof(words);
 printf("Size %d\n",size);
 disp(words,size);
 getch();
}

Программа скомпилирована в Borland Turbo C

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

В C синтаксис для передачи массива - это просто еще один способ сказать, что вы передаете указатель.Например:

void f(int a[])

это просто еще один способ сказать

void f(int *a)

Это специальный синтаксис в языке, и он предназначен для того, чтобы сделать параметры более самодокументированными, но этоможет также привести к путанице в ситуациях, подобных тому, что вы описываете.

В вашем случае объявление:

void disp(char words[][12],int size)

фактически говорит:

void disp(char (*words)[12],int size)

То есть словауказатель на массив из 12 символовА размер указателя в вашем случае составляет два байта.

1 голос
/ 20 марта 2012

Вам нужно лучше понять разницу между массивом и указателями.Также этот sizeof вычисляется во время компиляции, поэтому sizeof слов в main может получить фактический размер (ваш массив слов представляет собой двумерный массив символов, а не обычный массив указателей символов, поэтому каждая строка имеет размер 12, что в общей сложности составляет 48).Внутри disp нет способа узнать, где заканчивается массив, и, следовательно, нет способа определить его размер.Прочитайте k & r для лучшего понимания

1 голос
/ 20 марта 2012

sizeof в main() дает размер массива.
В sizeof в функции disp() указывается размер указателя.

Это потому, что когда вы пытаетесь передать массив в функцию, он распадается на указатель на свой первый элемент.
Единственный способ получить размер массива внутри функции - это передать егов качестве отдельного аргумента функции, и это самый обычный способ сделать это.

...