Vampire 1996 Ответов: 3

Как вычислить размер указателя по переданным аргументам функции


привет
я пытаюсь получить размер массива указателей после перехода к функции.
но не получается правильно.
загляни в мой код
когда я печатаю размер фруктового массива указателя он дает правильный ответ 48
но когда я печатаю проходящий аргумент ptr2 массив указателей он дает 8

Что я уже пробовал:

#include <stdio.h>
#include "string.h"
const char *const fruit[]=
{
	[1] ="apple1",
	[5]= "apple2",
	[3] ="apple3",
	[4] ="apple4"	
};


int total_index(const char *const  ptr2[])
{

	int a=0;
	a= sizeof(ptr2);
	printf("size of array of pointers %d\n",a);

	a= sizeof(fruit)
	printf("size of array of pointers %d\n",a);

        return a;
	
}
int main()
{
	printf(" indexes %d",total_index(fruit));
	return 0;
}

KarstenK

одно короткое дополнение: размер указателей зависит только от настроек компилятора, потому что это всего лишь адрес памяти. Объекты или массивы, на которые он указывает, могут отличаться :-O

3 Ответов

Рейтинг:
23

Jon McKee

С const char *const fruit[], фрукт-это название весь массив. Но массивы передаются как указатели для повышения эффективности, поэтому ptr2 эквивалентен const char * const *. Ptr2-это просто указатель на элемент массива Итак, когда вы это сделаете sizeof(fruit) вы проверяете размер массива, но когда вы это делаете sizeof(ptr2) вы проверяете размер указателя.

Хорошее базовое, бесплатное руководство по C с разделом о некоторых интересных массивах и указателях:
http://cslibrary.stanford.edu/101/EssentialC.pdf[^]

Чтобы ответить на вопрос в заголовке: вы не можете без передачи другого параметра (размер массива) или определения некоторого "символа завершения", такого как "\0", чтобы указать конец массива. Именно поэтому строки в стиле C заканчиваются символом '\0'.


Vampire 1996

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

Итак, как я могу вычислить общие индексы в массиве указателей с помощью указателя ptr2


#включить <stdio.h>
#включить "string.h"
const char *const fruit[]=
{
[1] ="apple1",
[5]= "apple2",
[3] ="apple3",
[4] ="apple4"
};


int findtarget( char* ptr1,const char *const ptr2[])
{

int a=0;
a= sizeof(fruit)/sizeof(fruit[0]);
printf("размер массива указателей %d\n",a);
a= sizeof(fruit)/sizeof(fruit[0]);
printf("размер массива указателей %d\n",a);
int i=0;
для(i=0;i

Jon McKee

Если я понимаю, о чем вы просите, и вы вынуждены использовать данный код, вы не можете сделать это только с помощью ptr2. Тебе тоже придется это сделать:
1) Определите некоторое конечное значение для массива (например, всегда имейте дополнительное значение в конце массива, равное нулю). Это позволит вам перебирать массив до тех пор, пока вы не нажмете null (конец массива).
2) Добавьте еще один параметр в findtarget, который является размером массива.
3) ссылайтесь на имя всего массива из функции, как то, что вы делаете в приведенном выше коде (sizeof(fruit)/sizeof(fruit[0])).

Рейтинг:
12

CPallini

Поскольку Ваш массив содержит "дыры", единственный жизнеспособный подход-передать его размер, например

#include <stdio.h>
#include "string.h"
const char *const fruit[]=
{
        [1] ="apple1",
        [5]= "apple2",
        [3] ="apple3",
        [4] ="apple4"
};


void show(const char *const  item[], size_t items)
{
        for ( size_t n = 0; n < items; ++n)
                printf("item[%lu] = %s\n", n, item[n]);
}
int main()
{
        show( fruit, sizeof(fruit)/sizeof(fruit[0]) );
}


С более "регулярным" массивом (то есть без отверстий) подход "sentinel" является альтернативой
#include <stdio.h>
#include "string.h"
const char *const fruit[]=
{
        "apple1",
        "apple2",
        "apple3",
        "apple4",
        NULL // sentinel
};


void show(const char *const  item[])
{
        for ( size_t n = 0; item[n]; ++n)
                printf("item[%lu] = %s\n", n, item[n]);
}
int main()
{
        show( fruit );
}


Рейтинг:
1

OriginalGriff

Вы не можете: с не позволит вам сделать это.
Массив на самом деле не существует - это "синтаксический сахар" для указателя плюс некоторая простая арифметика, и как только массив передается функции, он перестает быть массивом и становится "просто указателем", поскольку система понятия не имеет, сколько элементов он содержит.

Все что вам нужно сделать это передать массив и его количество элементов в вашу функцию:

void MyFunc(int arr[], int elements)
   {
   ...
   }
Или
void MyFunc(int *arr, int elements)
   {
   ...
   }
Эквивалентны.