LINUX.ORG.RU

Си


2

4
#include <stdlib.h>
#include <stdio.h> 

int main(int argc, char *argv[]) {

char *num = «5555»; 	
	
	if (argc != 2) {
	printf(«No param\n»);
		exit(0);
	}
	
	if (argv[1] != num) {
	printf(«Fail num %s\n»,num);
	printf(«Fail arg %s\n»,argv[1]);
		exit(0);
	}

...
}

Подскажите, почему сравниваются два одинаковых значения, но определяются, как - неодинаковые!

Вывод программы:

Fail num 5555
Fail arg 5555

Ответ на: комментарий от anonymous

прочитай man на calloc

++

А малюсенькие объемы памяти можно и как динамический массив выделять (но я так никогда не делал).

Anon
()
Ответ на: комментарий от anonymous

anonymous
=Во-первых, если ты memset-ом занулил память, нахрена ты её повторно зануляешь
в цикле?=

Вот самый главный вопрос. Объясните мне, если NULL != 0, то указатели будут
не NULL. Вот это непонятно. Далее в программе встречаются такие штуки:

    if(def->arr_abc[k].l == NULL) ....
Как они будут работать? Язык СИ

Про calloc слыхал, а практически не применял, ну это сейчас неважно.

oleg_2
()
Ответ на: комментарий от oleg_2

Объясните мне, если NULL != 0

Ты не сечешь. Смотри. Во-первых. NULL == 0 чисто синтаксически, с точки зрения языка. Однако язык ничего не гарантирует по поводу того, как NULL будет представлен на битовом уровне в аппаратуре машины. Ты, похоже, именно об этом спрашиваешь.

А отсюда вытекает «во-вторых»: теоретически возможна такая архитектура, где ты занулишь память memset-ом, а потом результат при сравнении не даст равенство на NULL.

Но на практике такие архитектуры не встречаются. Так что если ты не пишешь на Си код для инопланетян, просто забей и считая, что NULL всегда имеет все биты устанволенными в ноль. И спокойно зануляй области памяти как хочешь.

anonymous
()
Ответ на: комментарий от oleg_2

Вот так рас, посмотрите цикл в коде, что это, как не обход структуры? memset нужен всё равно, там есть еще переменные, которые я не указал, и которые надо обнулять (int-ы).

цикл вроде правильный.

memset всё равно НЕ нужна. int'ы в том же цикле вставьте.

emulek
()
Ответ на: комментарий от oleg_2

Нашелся человек, который уверял, что memset достаточно, цикл не надо.

В стандарте написано (17.1), что NULL это НЕ ноль! Это какое-то число, и если преобразовать 0 в указатель, получится NULL, а если преобразовать обратно, получится (из NULL) false(типа тоже ноль). Но NULL это не 0.

А если попытаться посмотреть, что внутри нуля ПОЛУЧЕТСЯ УЕТА. Это UB называется. Т.е. получится ЧТО УГОДНО. Это если как вы, в память писать/читать.

В чем Вы мину увидели? Цикл есть, NULL присваивается? Может Вы этого сначала незаметили?

заметил. Ну НЕЛЬЗЯ так делать.

Не верите мне — читайте стандарт. Да, у меня тоже пока работает.

И это, я предлагал не глобальные, а статические. Это разные вещи.

Статические — это такие глобальные переменные, которых в других модулях трансляции (грубо говоря в *.с файлах(точнее obj)) просто не существуют. А в остальном тоже самое. гуглите про static.

emulek
()
Ответ на: комментарий от anonymous

Итого: весь код можно заменить на вызов одной функции.

слушай, возьми php, там вообще всё это не нужно. И иди отсюда, неуч.

emulek
()
Ответ на: комментарий от Anon

А малюсенькие объемы памяти можно и как динамический массив выделять (но я так никогда не делал).

тогда для тебя man alloca

я разрешаю. Только не наглей, а то рухнет.

emulek
()
Ответ на: комментарий от oleg_2

Вот самый главный вопрос. Объясните мне, если NULL != 0, то указатели будут не NULL. Вот это непонятно. Далее в программе встречаются такие штуки: if(def->arr_abc[k].l == NULL) .... Как они будут работать? Язык СИ

внутри NULL _может_ быть 123.

Когда ты преобразуешь ЧИСЛО 0, В УКАЗАТЕЛЬ, то компилятор пишет в этот в указатель число 123.

т.е.

// определение NULL
#define NULL ((void*)0)

// эти две строчки эквивалентны
// тут число преобразуется в указатель
// и получается 123
// которое пишется в ptr
char *ptr = NULL;
char *ptr = ((void*)0);

if(ptr)// а тут число 123 превращается в 0(НОЛЬ) обратно
// получается false и этот код не выполняется
else
//а это выполняется

emulek
()
Ответ на: комментарий от anonymous

Но на практике такие архитектуры не встречаются.

на практике ты советуешь пісать код с UB.

anonymous
()
Ответ на: комментарий от anonymous

Но на практике такие архитектуры не встречаются

Ну как сказать... 8086. Там именно так. Указатель состоит из сегмента + смещения, а NULL вполне может иметь ненулевой сегмент.

monk ★★★★★
()
Ответ на: комментарий от monk

8086. Там именно так. Указатель состоит из сегмента + смещения

А в Watcom C++ то же самое на 386.

Это потом сказали «плоская память — наше всё» и забрали адрес сегмента у прикладной программы.

monk ★★★★★
()
Ответ на: комментарий от monk

На 8086 вообще были компиляторы сишечки на костылях, бесконечно далеких от стандарта.

Платформенно-независимый Си — это ненаучная фантастика. Чтобы на этом языке писать всегда нужно было знать особенности платформы и всегда будет нужно. Потому что те вещи, которые на нём пишут, они обычно с этой самой платформой взаимодействуют самым прямым образом.

Указатель состоит из сегмента + смещения, а NULL вполне может иметь ненулевой сегмент.

Эм. А покажи-ка мне компилятор, который поддерживает сегментную модель 8086 и при этом для длинных указателей NULL на нём не равен «все биты в ноль».

anonymous
()
Ответ на: комментарий от anonymous

Почему баттиного виртуала не банят?!?

Потому что он типичный лоровец. Читать и думать не умеет, только писать и истерить.

anonymous
()
Ответ на: комментарий от emulek

слушай, возьми php, там вообще всё это не нужно.

Понадобится, возьму и php. В отличие от тебя, дебила, я могу пользоваться любым ЯП в качестве инструмента, потому что имею привычку читать референс мануалы и инструкции.

И иди отсюда, неуч.

А нето что? Обратишься с претензиями в спортлото?

anonymous
()
Ответ на: комментарий от anonymous

А покажи-ка мне компилятор, который поддерживает сегментную модель 8086 и при этом для длинных указателей NULL на нём не равен «все биты в ноль».

Так Borland C++. Модель памяти сейчас не вспомню (medium вроде), но NULL был равен DS:0000. А DS не 0, так как в нулевом сегменте таблица прерываний и прочие очень нужные штуки...

monk ★★★★★
()
Ответ на: комментарий от monk

В медиуме указатели на данные были near. А т.к. это просто 16-битовые значения, адресующие память по смещению сегментного регистра, и «сравнивать с DS» там просто нечего. То есть нулевой указатель, технически, адресовал именно DS:0, но сам-то он всё-равно из нулевых битов полностью состоял.

anonymous
()
Ответ на: комментарий от monk

Откопал дистрибутив Turbo C++ 3.0, запустил в досбоксе.

Ностальгия накатила. Всё-таки какая же продуманая среда разработки для своего времени. Да многим этим современным недо IDE да неё как до Парижа раком.

1992 год. Большинство местных неадекватов в то время еще титьку сосали, или вообще только в проекте были.

anonymous
()
Ответ на: комментарий от monk

Короче, ты не прав. Вот такой код:

int f1(char near *p)
{
	return (p == NULL);
}

int f2(char far *p)
{
	return (p == NULL);
}

Компилируется вот в это:

; f1(signed char *)
; Attributes: bp-based frame

		public @f1$qpzc
@f1$qpzc	proc far

arg_0		= word ptr  6

		push	bp
		mov	bp, sp
		cmp	[bp+arg_0], 0
		jnz	loc_1_E
		mov	ax, 1
		jmp	short loc_1_10
loc_1_E:
		xor	ax, ax
loc_1_10:
		jmp	short $+2
		pop	bp
		retf
@f1$qpzc	endp


; f2(signed char far *)
; Attributes: bp-based frame

		public @f2$qnzc
@f2$qnzc	proc far

arg_0		= word ptr  6
arg_2		= word ptr  8

		push	bp
		mov	bp, sp
		mov	ax, [bp+arg_0]
		or	ax, [bp+arg_2]
		jnz	loc_1_24
		mov	ax, 1
		jmp	short loc_1_26
loc_1_24:
		xor	ax, ax
loc_1_26:
		jmp	short $+2
		pop	bp
		retf
@f2$qnzc	endp

(Да, это листинг из пераццкой Иды. Кто угадал при чтении, тот молодец и Ъ.)

anonymous
()
Ответ на: комментарий от emulek

Кого нас? Анонимусов? Ебать ты дурак.

anonymous
()
Ответ на: комментарий от emulek

if(ptr)// а тут число 123 превращается в 0(НОЛЬ) обратно

А где можно почитать про приведение нулевого указателя _к_ числу? Как-то по диагонали в стандарте не нашлось.

anonymous
()
Ответ на: комментарий от anonymous

Блин, похож, а еще думалось: откуда столько комментов.

anonymous
()
Ответ на: комментарий от anonymous

Понадобится, возьму и php. В отличие от тебя, дебила, я могу пользоваться любым ЯП в качестве инструмента, потому что имею привычку читать референс мануалы и инструкции.

ну вот тебе новое: 7.17.3

The macros are NULL which expands to an implementation-defined null pointer constant;

видать до этого места ты не дошёл. Надеюсь теперь ты понимаешь, какой быдлокод ты посоветовал? Да, детка, NULL расширяется в implementation-defined, а вот твои нолики — так и пишутся, как есть.

А нето что?

ничего. Мне придётся поправлять каждую твою ошибку, и ликвидировать и далее твою безграмотность.

Единственное, что меня радует, так это то, что таких как ты немного. Большинство сначала разберутся в предмете, а потом уже советуют.

emulek
()
Ответ на: комментарий от anonymous

Платформенно-независимый Си — это ненаучная фантастика. Чтобы на этом языке писать всегда нужно было знать особенности платформы и всегда будет нужно. Потому что те вещи, которые на нём пишут, они обычно с этой самой платформой взаимодействуют самым прямым образом.

Эм. А покажи-ка мне компилятор, который поддерживает сегментную модель 8086 и при этом для длинных указателей NULL на нём не равен «все биты в ноль».

всё это является оправданием того, что ты не дочитал стандарт до 7.17.3?

emulek
()
Ответ на: комментарий от emulek

Единственный, чью безграмотность приходится поправлять тут в каждом треде, это ты, дебушка. Доктор ЛОР рекомендует эвтаназипам-форте. Говорят, хорошо помогает от тех тараканов, что сожрали твой мозг.

anonymous
()
Ответ на: комментарий от monk

Так Borland C++. Модель памяти сейчас не вспомню (medium вроде), но NULL был равен DS:0000. А DS не 0, так как в нулевом сегменте таблица прерываний и прочие очень нужные штуки...

ну к счастью это только в far far. В сишечке ЕМНИП это только в longjump'ах появлялось. Обычный NULL всегда был нулём. Хотя может я и путаю...

emulek
()
Ответ на: комментарий от anonymous

А где можно почитать про приведение нулевого указателя _к_ числу? Как-то по диагонали в стандарте не нашлось.

яхз. Там как-то криво этот момент расписан, неразборчиво. Ну типа что «можно в качестве „условного выражения“ юзать указатель. В т.ч. нулевой». Я так домыслил. Каюсь...

emulek
()
Ответ на: комментарий от anonymous

Единственный, чью безграмотность приходится поправлять тут в каждом треде, это ты, дебушка. Доктор ЛОР рекомендует эвтаназипам-форте. Говорят, хорошо помогает от тех тараканов, что сожрали твой мозг.

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

emulek
()
Ответ на: комментарий от anonymous

и всё таки ТP был продуманее(один качественный контекстный хэлп с примерами очень очень).

особенно TP1.1 :)

а так конечно TP5.5 и TP7

qulinxao ★★☆
()
Ответ на: комментарий от emulek

Тебя бесполезно поправлять, ты слишком глуп и агресивен, чтобы понимать человеческую речь.

Это Reset-у делать нечего, он с тобой вон носится как с писаной торбой в треде про безопасность виндов. А я давно убедился, что подобные тебе обучаться не способны.

anonymous
()
Ответ на: комментарий от qulinxao

Я с ним почти не сталкивался, не помню уже даже. Но совсем не удивительно, что он был продуманнее, всё ж таки у компании упор был именно на него, а не на сишечку.

anonymous
()
Ответ на: комментарий от anonymous

Тебя бесполезно поправлять, ты слишком глуп и агресивен, чтобы понимать человеческую речь.

ты никогда не задумывался, что ты только-что поделил на ноль? Кому и зачем адресовано твоё полное боли послание?

Это Reset-у делать нечего, он с тобой вон носится как с писаной торбой в треде про безопасность виндов. А я давно убедился, что подобные тебе обучаться не способны.

а почему общаешься с безнадёжными? Не боишься заразиться?

emulek
()
Ответ на: комментарий от qulinxao

и всё таки ТP был продуманее(один качественный контекстный хэлп с примерами очень очень).

а по моему — полный поскакал. Синдром утёнка детектед.

emulek
()
Ответ на: комментарий от emulek

а почему общаешься с безнадёжными?

Ради лулзов.

полное боли послание

Не переоценивай себя. Комик из тебя вполне, а вот ДРАМЫ не выйдет.

anonymous
()
Ответ на: комментарий от anonymous

Не переоценивай себя. Комик из тебя вполне, а вот ДРАМЫ не выйдет.

дык я и не корчу из себя Станислвавского. А вот ты — пытаешься. Ну в принципе не ДРАМА, но сопли вперемешку с поносом у тебя получились. Я доволен вашим спектаклем, однако на бис звать не стану.

emulek
()
Ответ на: комментарий от emulek

ты.

первый язык на первом компе у мя «sincler basic» - пока «подключали» «клавиатуру» к телевизору ознакомился с лисп,алгол,фортран,pl1 - всё очень поверхностно.

паскаль имеет кучу не достатков ( в том же тп нельзя было возвращать структуры из процедур :( , нет замыканий хотя есть вложенность процедур, нет сборщика муссора хотя есть дисплеи для связывания контекстов процедур и т.п.)

у тебя с детектором бЯда.

а tp был крут именно своей средой и контекстной помощью т.е язык вообще мог был любым лишбы фаза получение исполнения из сырца была пользователю мала/вообще не заметна.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Нафиг тред про ооп создал в толксах? Нипафлудить.

anonymous
()

Вот не понимаю, что делает этот детский вопрос про сравнение строк на таком серьезном ресурсе, как лор?

По-моему, это откровенное неуважение к профессиональному сообществу со стороны вопрошающего

zenden
()
Ответ на: комментарий от tazhate

ну а не как сейчас, извергать свой обычный понос.

Тон смени.

Уважаемый tazhate, если Вы желаете, что-бы я к Вам относился с должным уважением, то либо пишите от своего имени(а не от имени анонимуса, как в позапрошлом посте, на который я ответил), либо выдайте мне права модератора, что-бы я мог Вас узнавать по IP адресу и/или UA.

С уважением.

emulek
()
Ответ на: комментарий от dvl36

Куда уж стандартнее. :D А ты не догадался зачем я написал про два нуля?

нет. А что, там кто-то говорил, что проверяется только половинка адреса?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.