информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медАтака на InternetСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Серьезная уязвимость в Apache Log4j 
 Крупный взлом GoDaddy 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Требую сатисфакции !!! 07.06.05 18:44  Число просмотров: 1681
Автор: PS <PS> Статус: Elderman
Отредактировано 07.06.05 18:48  Количество правок: 2
<"чистая" ссылка>
> > Ведь [любой тип]* - занимает 4 байта, что полностью
> мапится
> > на переменую типа int.

> Твой пример работает только с (char *), а отсылка к [любому
> типу] некорректна, потому как арифметика указателей явно
> говорит, что в результате вычитания указателей получается
> не смещение в байтах, а количество элементов данного типа
> между этими указателями.

Обрати внимание, что я не сказал будто int* a = 0; a++; это тоже самое что и char* c=0; c++;
НЕ БЫЛО ТАКОГО! В строчке
> > Ведь [любой тип]* - занимает 4 байта, что полностью
> мапится
> > на переменую типа int.

говорится только о величине переменной в байтах, и о том, что указатель можно(!) хранить в int !
double* d; int a= d; d=a; - запись корректна!
Ты же говоришь о том, что
double* d;
int a = d;
a++;
d++;
дадут разные результаты.
Согласен, но об этом у меня не было НИ СЛОВА!
Так что стреляемся на ножах !!!! :)))
<beginners>
Запутался с указателями 07.06.05 16:37  
Автор: Изучаю С Статус: Незарегистрированный пользователь
<"чистая" ссылка>
char *s;
char buf[100];
int i;

s=strstr(buf, "test");

Хочу в i получить смещение строки "test" в строке buf.
Почему не работает i=s-&buf?

Как сделать, чтобы работало?
Re 07.06.05 17:11  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> char *s;
> char buf[100];
> int i;
>
> s=strstr(buf, "test");
>
> Хочу в i получить смещение строки "test" в строке buf.
> Почему не работает i=s-&buf?
>
> Как сделать, чтобы работало?
buf - это на самом деле указатель сам по себе. То бишь
char buf[100];
это то же самое, что и
char *buf=(char *)(malloc(sizeof(char)*100));
а
buf[0]
это тоже самое что и
*buf
Стало бы амперсанд перед buf лишний - ты получаешь указатель на указатель.

Второе замечание: i - переменная типа int. Я не помню точно, но вроде как Си не умеет приводить указатели к другим типам, отличных от указателей.

Что делать: писать собственную функцию поиска подстроки, которая будет возвращать целое значение. Или искать подобную библиотечную (но я про такие не слышал).
Поправка 07.06.05 18:15  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> buf - это на самом деле указатель сам по себе. То бишь
> char buf[100];
> это то же самое, что и
> char *buf=(char *)(malloc(sizeof(char)*100));

buf может неявно приводиться к указателю на первый (в смысле нулевой) элемент, но массив и указатель это абсолютно разные вещи.

Например

char *pointer=(char *)(malloc(sizeof(char)*100));
char array[100];
assert(sizeof(pointer) == sizeof(array));

---

Вывалится в дебаггер при первой же возможности. В C++ можно доказать, что типы разные еще и при помощи typeid или dynamic_cast

> Второе замечание: i - переменная типа int. Я не помню
> точно, но вроде как Си не умеет приводить указатели к
> другим типам, отличных от указателей.

Опять таки неявно он может и не приведет, а явное приведение выполняется леХко.

> Что делать: писать собственную функцию поиска подстроки,
> которая будет возвращать целое значение. Или искать
> подобную библиотечную (но я про такие не слышал).

Ну человек явно указал библиотечную функцию поиска подстроки - strstr ее зовут
не путай ребенка :) 07.06.05 17:30  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
В С возможно любое приведение, иногда это порождает ТАКИЕ приведения, что проще переписать, чем на них охотиться :)
Но это лирика, а физика в том, что
int i;
char* S1;
char* S2;
i = S2 - S1;
Абсолютно валидно, без всяческих доп. усилий.
Ведь [любой тип]* - занимает 4 байта, что полностью мапится на переменую типа int.
Ну заодно и ты не путай ребенка :-) 07.06.05 18:09  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> В С возможно любое приведение, иногда это порождает ТАКИЕ
> приведения, что проще переписать, чем на них охотиться :)
> Но это лирика, а физика в том, что
> int i;
> char* S1;
> char* S2;
> i = S2 - S1;
> Абсолютно валидно, без всяческих доп. усилий.
> Ведь [любой тип]* - занимает 4 байта, что полностью мапится
> на переменую типа int.
Твой пример работает только с (char *), а отсылка к [любому типу] некорректна, потому как арифметика указателей явно говорит, что в результате вычитания указателей получается не смещение в байтах, а количество элементов данного типа между этими указателями.

#include <stdio.h>

void
main() {
	char *pc1 = (char *)123456, *pc2 = pc1 + 5;
	int numchars = pc2 - pc1;
	int *pi1 = (int *)123456, *pi2 = pi1 + 5;
	int numints = pi2 - pi1;

	printf("%d\n%d\n", numchars, numints);
}

---

Выдает

5
5

---

Хотя sizeof(int) == 4 на моей машине.
Требую сатисфакции !!! 07.06.05 18:44  
Автор: PS <PS> Статус: Elderman
Отредактировано 07.06.05 18:48  Количество правок: 2
<"чистая" ссылка>
> > Ведь [любой тип]* - занимает 4 байта, что полностью
> мапится
> > на переменую типа int.

> Твой пример работает только с (char *), а отсылка к [любому
> типу] некорректна, потому как арифметика указателей явно
> говорит, что в результате вычитания указателей получается
> не смещение в байтах, а количество элементов данного типа
> между этими указателями.

Обрати внимание, что я не сказал будто int* a = 0; a++; это тоже самое что и char* c=0; c++;
НЕ БЫЛО ТАКОГО! В строчке
> > Ведь [любой тип]* - занимает 4 байта, что полностью
> мапится
> > на переменую типа int.

говорится только о величине переменной в байтах, и о том, что указатель можно(!) хранить в int !
double* d; int a= d; d=a; - запись корректна!
Ты же говоришь о том, что
double* d;
int a = d;
a++;
d++;
дадут разные результаты.
Согласен, но об этом у меня не было НИ СЛОВА!
Так что стреляемся на ножах !!!! :)))
Да, формально ни единой ошибки не было 08.06.05 12:23  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Но стиль изложения все таки предполагал неверный ход мыслей (если предположить, что "ребенок" вообще не знает C) в дальнейшем. Я просто залепил это тупиковое ответвление

ЗЫ: Оружие для дуэли выбирает вызываемый. Я выбираю харькачки с жеваной бумагой :-)
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach