LINUX.ORG.RU

Ошибка сегментирования (сделан дамп памяти)

 


0

2
#include <stdio.h>

int main(void)
{
	char mask[16];

	mask['0']='0000';
	mask['1']='0001';
	mask['2']='0010';
	mask['3']='0011';
	mask['4']='0100';
	mask['5']='0101';
	mask['6']='0110';
	mask['7']='0111';
	mask['8']='1000';
	mask['9']='1001';
	mask['a']='1010';
	mask['b']='1011';
	mask['c']='1100';
	mask['d']='1101';
	mask['e']='1110';
	mask['f']='1111';

	puts(mask[0]);

	return 0;
}

Подскажите что не так делаю? UBUNTU 14.04



Последнее исправление: beastie (всего исправлений: 2)

Все делаешь не так. Перечитай мурзилку по C.

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

Ага, и получить от этого упоротого ещё один вопрос - почему не работает как надо.

exception13 ★★★★★
()

Занятно ты создал mask[16] и обращаешься к mask[102] (то, что mask['f']).

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

Чтобы такого бреда не писать, всегда делай gcc -Wall -Werror -Wextra

Eddy_Em ☆☆☆☆☆
()

'1'

'0001'

что не так делаю?

Всё

Deleted
()

Думаю, в этот раз тебе всё-таки придется сначала прочитать инструкцию (в виде K&R или других книг по азам C). Ты совершенно не понимаешь, что тут написано, и судя по всему это какая-то плохая аналогия с другим знакомым языком.

Кратко:

int main(void)

Плохо, но терпимо

сhar mask[16];
mask['0']='0000';

Всё, дальше пошел бред. Разница между 0, '0' и «0» не такая как во всяких скриптовых языках, а гораздо существеннее. Это не то чтобы не совсем одно и то же, это вообще совершенно разные сущности, с совершенно разной семантикой, и их нельзя заменить одну на другую где в голову взбрело (т. е. вообще нигде нельзя).

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

int puts(const char *str);

char mask[16];

puts(mask[0]);

у ТСа параметром передаётся не указатель на строку, а неинициализированный char

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

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7abe0aa in strlen () from /lib64/libc.so.6
(gdb)

qbe
()

Подскажите что не так делаю? UBUNTU 14.04

Из рубрики «Засмеялся - проиграл»

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

Больше похоже на VHDL головного мозга.

anonymous
()

всё норм.

пишешь на awk

а вот компилять сс не нужно awk-код.

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

int main(void)

Плохо, но терпимо

С чего бы это плохо? Аргуметов функция не принимает, значит должна быть функция без аргументов. Функция без аргументов в Си это только void, пустые скобки равнозначны () -> (...).

Это если мы говорим о Си (в тегах Си ведь!), в C++ () -> (void).

RTFM.

Deleted
()

Подскажите что не так делаю?

gcc -Wall file.c спасет отца русской демократии.

Также советую использовать gdb (тогда компилять с ключем -g) и clang (более читаемые из терминала предупреждения об ошибках).

Deleted
()

А может это вброс какой был?
Но что-то уныло, да(

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

И что же из этого следует? Да и с чего их 2?

anonymous
()

Походе на смесь php, python и perl.

itn ★★★
()

Мои глаза!

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

Впрочем, щас погуглил немного, и видимо я не прав, можно использовать оба варианта. Почему-то думал, что void аргументы у main — это ошибка, как, например, void main.

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

можно использовать оба варианта.

Что за оба варианта?

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

можно использовать оба варианта.

Что за оба варианта?

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

Да, верно, их три. Я имел в виду те два, которые подразумевались в обсуждении выше (один в примере, и один, который используется в 90% программ, с argc и argv).

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

Совершенно не согласен. Я не хочу, чтобы у меня программа отказывалась компилироваться из-за какой-нибудь там неиспользованной переменной, потому что я ее использование закомментировал для дебаггинга. Прочитать прежупреждения и исправить их я могу даже если компиляция все равно пройдет успешно.

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

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

Руки оторвать!

я ее использование закомментировал для дебаггинга

Подсказываю:

#define _U_    __attribute__((__unused__))
...

int _U_ var_not_used, var_used;

Eddy_Em ☆☆☆☆☆
()

Подскажите что не так делаю?

всё.

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

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

Руки оторвать!

сперва найди!

__attribute__((__unused__))

любопытный костыль.

ЗЫЖ не пойму только одно: чем это помогло hlebushek при его «дебаггинга»? Когда в переменную записывается фаза луны умноженная на длину члена говнокодера в мирко-вершках, это чем помогает?

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

любопытный костыль

Это не костыль, а удобная штука. Я постоянно пользуюсь, т.к. при отладке иной раз нужно кусок кода закомментировать, в итоге остаются неиспользуемые переменные. Поэтому можно сразу набулькать этих _U_, а чтобы не смущала при release'ном компилянии, определить _U_ как "пусто", если не определен -DEBUG.

Вообще же, для аргументов функций есть другой "хак":

type function(type var1, type var2){
   (void) var1;
...
}
В этом случае var1 не считается лишним аргументом. Но мне больше нравится тоже писать:

type function(_U_ type var1, type var2)
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

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

ты тоже любитель в начале функции наобъявлять все переменные, а потом удивляться, почему у тебя v==17, хотя ты её нулём инициализировал?

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

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

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

чтобы потом не искать по шестистраничной функции, в каком-же месте эта переменная объявлена, если ей надо тип поменять или еще чего.

1. шестистраничные функции == зло

2. зачем искать?

void foo()
{
  // Over9000 строк
  {// обычно нужен, для какой-нить while/if
     int* a = malloc(…);
     // ещё Over9000 строк
     free(a);
  }// отсюда до malloc'а и объявления a можно сразу прыгать процентом
}

emulek
()
Ответ на: комментарий от Eddy_Em
// ещё Over9000 строк
     free(a);

отличный способ забыть про free.

эти Over9000 строк юзают массив a.

Да, лучше в функцию, но тогда у тебя 6 страниц не получится.

emulek
()

Мне кажется или я здесь вижу пхп?

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