0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 25
1

Работа sizeof

27.04.2012, 11:48. Показов 2065. Ответов 8
Метки нет (Все метки)

Здравствуйте. Имеется код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
 
extern char **environ;
int i = 0;
int main(int agrc, char **argv)
{
  if (argv < 3)
  {
    write(1, "Too few arguments", sizeof("Too few arguments"));
    exit(1);
  }
  setenv(argv[1], argv[2], 0);
  while (environ[i])
  {
    write(1, environ[i], sizeof(environ[i]));
    write(1, "\n", 1);
    i++;
  };
};
Как видно, решается задача добавления переменной в среду окружения процесса. Для проверки результата производится вывод списка всех переменных. Вопрос: почему sizeof неправильно определяет размер environ[i]? Во всяком случае, в каждой строке отображается только по 4 символа.
P.S. При выполнении задачи необходимо пользоваться только системными вызовами. Именно поэтому используется write, а не что-то другое.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2012, 11:48
Ответы с готовыми решениями:

Что обозначает строка вида sizeof(data)/sizeof(data[0])?
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; void bubble_sort(float *data, int size) { int i,j; ...

На sizeof жалуется
Вот кода: #include &lt;iostream&gt; /* run this program using the console pauser or add your own...

Память. sizeof
Простейшая прога, Почему результат sizeof = 4 ?? И как узнать размер текста в байтах/битах для...

Sizeof структуры
Доброго времени суток, вопрос в общем таков: struct MyStruct { AnyType var; }; ...

8
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11652 / 7164 / 1701
Регистрация: 25.07.2009
Сообщений: 13,124
27.04.2012, 15:13 2
Цитата Сообщение от dessaber Посмотреть сообщение
Вопрос: почему sizeof неправильно определяет размер environ[i]? Во всяком случае, в каждой строке отображается только по 4 символа.
Цитата Сообщение от dessaber Посмотреть сообщение
**environ
Указатель на указатель. То есть enveron[i] - по сути указатель на char, и его длина (в 32-битной системе) 4 байта.
0
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 25
27.04.2012, 18:15  [ТС] 3
Это я конечно дал маху... Вот только как решить эту проблему? Исправить вхождение аргументов во write, или требуется нечто большее? Освежил в памяти указатели, ярлыки, но легче не стало. Можно сделать дополнительный массив, чтобы перегнать в него значения из **environ, но есть подозрение, что станет только хуже.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11652 / 7164 / 1701
Регистрация: 25.07.2009
Сообщений: 13,124
27.04.2012, 19:34 4
Да проще надо быть!
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main(int argc, char ** argv, char ** envp) {
    while ( *envp )
        printf("%s\n", *envp++);
    
    return 0;
}
Вот только я сомневаюсь, что к этому массиву можно ещё что-то прилепить. Это в perl @ENV - просто массив, пихай, что хочешь. А в С setenv в помощь...
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
27.04.2012, 19:49 5
Цитата Сообщение от dessaber Посмотреть сообщение
Вот только как решить эту проблему
А что за проблема-то? Если вычислить длину строки - то для этого strlen'ом надо пользоватся
0
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 25
27.04.2012, 19:53  [ТС] 6
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
printf("%s\n", *envp++);
Цитата Сообщение от dessaber Посмотреть сообщение
При выполнении задачи необходимо пользоваться только системными вызовами. Именно поэтому используется write, а не что-то другое.
В этом-то вся и штука. Был бы printf - про sizeof и речи не было.

Цитата Сообщение от Evg Посмотреть сообщение
Если вычислить длину строки - то для этого strlen'ом надо пользоватся
C
1
 write(1, environ[i], sizeof(4*strlen(environ[i])));
The same result.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11652 / 7164 / 1701
Регистрация: 25.07.2009
Сообщений: 13,124
27.04.2012, 20:08 7
Цитата Сообщение от dessaber Посмотреть сообщение
При выполнении задачи необходимо пользоваться только системными вызовами. Именно поэтому используется write, а не что-то другое.
Странно это... Вышеозвученная strlen() тоже не считается? Ну тогда по-индусски как-нибудь
C
1
2
3
4
5
6
7
/*...*/
while ( *envp ) {
    char * p;
    for ( p = *envp; *p != '\0'; ++p )
        write(1, p, 1);
    ++envp;
}
А в чём прикол-то, чем printf не угодила?

Добавлено через 1 минуту
Цитата Сообщение от dessaber Посмотреть сообщение
C
1
write(1, environ[i], sizeof(4*strlen(environ[i])));
Говорю же - проще надо быть!
C
1
write(1, environ[i], strlen(environ[i]));
0
Evg
Эксперт CАвтор FAQ
21264 / 8280 / 637
Регистрация: 30.03.2009
Сообщений: 22,635
Записей в блоге: 30
27.04.2012, 20:20 8
Цитата Сообщение от easybudda Посмотреть сообщение
А в чём прикол-то, чем printf не угодила?
Тем, что его нету у человека

Добавлено через 2 минуты
кстати вот есть простенькая реализация printf'а
Как перенести параметры из ф-ции printf() в самодельную
0
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 25
27.04.2012, 20:33  [ТС] 9
Цитата Сообщение от easybudda Посмотреть сообщение
write(1, environ[i], strlen(environ[i]));
Блеск. Можно закрывать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2012, 20:33
Помогаю со студенческими работами здесь

Sizeof() не работает в функции
Хочу выделить функцию, которая будет подсчитывать символы в массиве int main() { int i =...

Неверный вывод sizeof
#include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; /* ДЛЯ РАБОТЫ С КИРИЛЛИЦЕЙ */ int...

Sizeof enum gdb
Здравствуйте уважаемые форумчане! Столкнулся со следующй ситуацией: пишу embeded проект на си,...

Возращение типа данных без sizeof
Нужно описать функцию sizeof, как это сделать?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru