Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
 Аватар для wrathchildtoo
1 / 1 / 0
Регистрация: 22.03.2009
Сообщений: 17

Функция sizeof вызванная в другой функции выдает неправильное значение

03.04.2009, 00:25. Показов 4101. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять, почему функция sizeof вызванная в другой функции выдает неправильное значение.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream.h>
#include<iomanip.h>
 
//ïðîòîòèï ôóíêöèè êîïèðîâàíèÿ ìàññèâà programCode[] â ìàññèâ memory[].
void loadProgramToMemory(short programCode[], short memory[]);
 
main()
{
    short memory[10] = {0};
    short programCode[] = {1003, 1103, 4300};
 
    //òóò ôóíêöèÿ sizeof ðàáîòàåò ïðàâèëüíî
    cout << "Size of programCode[] in main(), B: "
        << sizeof programCode << endl << endl;
 
    loadProgramToMemory(programCode, memory);
 
    //âûâîä íà ýêðàí ñîäåðæèìîãî ìàññèâà memory[]
    cout << "MEMORY:\n";
    for (int i = 0; i < 10; i++)
        cout << setw(6) << memory[i];
    cout << endl;
 
    return 0;
}
 
//ôóíêöèÿ êîïèðîâàíèÿ ìàññèâà programCode[] â ìàññèâ memory[].
void loadProgramToMemory(short programCode[], short memory[])
{
    cout << setw(6) << programCode[0]
        << setw(6) << programCode[1]
        << setw(6) << programCode[2] << endl << endl;
 
    //ñîáñòâåííî íåíîðìàëüíîå ïðîÿâëåíèå ô-èè sizeof
    cout << "Size of programCode[] in other function, B: "
        << sizeof programCode << endl << endl;
 
    // îïðåäåëåíèå ðàçìåðà ìàññèâà programCode[]
    int programSize = sizeof programCode / sizeof (short);
 
    for (int i = 0; i < programSize; i++)
        memory[i] = programCode[i];
}
Size of programCode[] in main(), B: 6

1003 1103 4300

Size of programCode[] in other function, B: 4

MEMORY:
1003 1103 0 0 0 0 0 0 0 0
Press any key to continue
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2009, 00:25
Ответы с готовыми решениями:

Почему вызванная функция не может изменить переменную из вызывающей функции?
У меня вопрос: Почему вызванная функция не может изменить переменную из вызывающей функции (она, типа того, может менять только свою...

Считывание из структуры файла выдает неправильное значение
Всем привет.Такая проблема.У меня задача считать и вывести значение из файла(бинарного) с известной структурой значения полей.Описал первый...

Функция с ассемблерной вставкой выдает неправильное значение
а=1, b=5 Должно выдавать 90, но выдает 216 // сама функция bool LeftExpr(int a, int b, long *result) { __asm{ //(a + b) ^...

10
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
03.04.2009, 00:45
ну а что ты хотел ведь в функцию ты передаешь указатель а потом сморишь скоко он весит
а все указатели весят 4 байтв вот он вычисляет 2 элемента
Решение:в функцию передавай еще один параметр колличество элементов
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
03.04.2009, 03:57
Цитата Сообщение от Mecid Посмотреть сообщение
ну а что ты хотел ведь в функцию ты передаешь указатель а потом сморишь скоко он весит
C++
1
void loadProgramToMemory(short programCode[], short memory[])
Я так и не понял где он передовал указатель....

Но в таком коде появились вопросы ..
C++
1
2
 sizeof programCode << endl << endl;//!может там была опечатка!?
int programSize = sizeof programCode / sizeof (short);//или здесь
0
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
03.04.2009, 07:05
void f(int *)
void f(int []);
и там и там передается указатель.
массив никогда не передается в функцию в виде локальной перемнной,передается только указатель
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
03.04.2009, 09:37
согласен с Mecid. Если хочешь избежать головной боли - передавай в функцию кол-во элементов.
0
 Аватар для wrathchildtoo
1 / 1 / 0
Регистрация: 22.03.2009
Сообщений: 17
03.04.2009, 12:17  [ТС]
Но как известно имя самого массива без [] является указателем на первый элемент массива. И в функцию я передаю именно указатель на первый элемент массива. В чём тогда разница?
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
03.04.2009, 13:27
Ох,могу и ошибаться.
В main в переменной programCode лежит смещение в сегменте .data до твоего массива,где собстно,раз не динамически созданный массив,указан и его размер.

Аргумент функции programCode есть тоже смещение,но уже до переменной размера в 4 байта где и будет хранится значение указателя.

Именно поэтому при обращение в main к programCode ты будешь получать смещение до массива,а в функции при обращении к programCode до указателя.

Поэтому и получаешь такие результаты.
0
 Аватар для wrathchildtoo
1 / 1 / 0
Регистрация: 22.03.2009
Сообщений: 17
03.04.2009, 14:47  [ТС]
Humanitis, раскажи или дай ссылочку где почитать что такое сегмент .data.
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
03.04.2009, 14:59
Думаю любой справочник по ассемблеру подойдет.
0
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
03.04.2009, 15:35
Цитата Сообщение от wrathchildtoo Посмотреть сообщение
В чём тогда разница?
Разница в том, что sizeof обрабатывается не в рантайме, а непосредственно компилятором в момент компиляции. В основной программе компилятор располагает данными о реальном размере массива, а в процедуре - нет.
0
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
03.04.2009, 21:27
вы что не читаете учебники?вот какая разница?в функцию передается 4-х байтовый указатель всегда,чтобы избежать накладных ресурсов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2009, 21:27
Помогаю со студенческими работами здесь

Програмка выдает неправильное значение
Здравствуйте форумчане, относительно недавно стал изучать C++ как хобби. Изучив немного операторов решил закрепить знания написав...

Mysql_insert_id выдает неправильное значение
Здравствуйте. Есть форма заполнения БД, после отправки формы надо чтобы выводил id только что созданной записи. прописал printf...

Как в delphi использовать значение, которое возвращает функция в другой функции
как в delphi использовать значение которое возвращает функция в другой функции??? Например : Procedure Start(var T); вот это...

Функция возвращает неправильное значение
есть у меня вот такая функция (не вдавайтесь особо в подробности): function can(ptype: byte; path: pchar): Boolean; begin case...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru