информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Re 07.06.05 17:11  Число просмотров: 1792
Автор: 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. Я не помню точно, но вроде как Си не умеет приводить указатели к другим типам, отличных от указателей.

Что делать: писать собственную функцию поиска подстроки, которая будет возвращать целое значение. Или искать подобную библиотечную (но я про такие не слышал).
<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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach