LINUX.ORG.RU

GCC взбесилси?

 , ,


1

3

пытался написать прогу, но почему то гцц начал ересь нести... при компиляции даже такого простейшего кода

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


void main(void) {
	char str1 = "razraz";
	printf ("\n");

	return;
}

выводит:
`--> gcc test.c -o testup
test.c: В функции «main»:
test.c:6:14: предупреждение: при инициализации указатель преобразуется в целое без приведения типа [-Wint-conversion]
  char str1 = "razraz";
              ^~~~~~~~

★★

char str1 = "razraz";

Зачем пихать строку в один байт? Строка - это массив байтов. В этом коде нет массива. А вот здесь уже есть:

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


int main() {
        char str1[] = "razraz";
        printf ("%s\n", str1);

        return 0;
}
Если в этом коде вернуть прежнюю форму без массива, то будет segfault. Именно потому, что строка не помещается в один единственный байт.

saahriktu ★★★★★ ()
Последнее исправление: saahriktu (всего исправлений: 1)

Для начала почини свой код. И попробуй учиться программировать по материалу свежее, чем у тебя.

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

ну ваще я делал так:

char * str1 = "razraz";

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

и да, где найтить материал свежий? я просто сча начал смареть вот енти видосы на сколька они нормальные?

safocl ★★ ()
Последнее исправление: safocl (всего исправлений: 1)

видосы по си — вот оно новое поколение программистов 🤦‍♂️

user_id_68054 ★★★★★ ()

Что-то даже не пойму, народ так тупо прикалывается, или у нас на самом деле все так плохо.

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

Сначала сделать именно указатель, затем выделить по этому указателю массив при помощи malloc(), а потом пользоваться как динамическим массивом.

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


int main() {
        char *str1;
        str1 = (char *) malloc (7);
        strcpy(str1, "razraz");
        str1[6] = '\0';
        printf ("%s\n", str1);
        free(str1);

        return 0;
}

saahriktu ★★★★★ ()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от safocl

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

Ещё в Си есть массивы строк:

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


int main() {
        int i;
        char * str1[] = { "razraz" , "dvadva", "tritri" };
        for (i=0; i < 3; i++) printf ("%s\n", str1[i]);

        return 0;
}

saahriktu ★★★★★ ()

Разумеется, виноват gcc. Сколько гениального кода было бы написано, если бы не он...

anonymous ()

Перестань пока код писать, и почитай книжку Kernighan & Ritchie «The C Programming Language». Пока не осилишь - ничего больше не пиши. Пожалуйста.

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

Для этого есть malloc() и realloc(), а также «char **strarray;» (да, в этом случае можно менять размер каждой строки в массиве на ходу индивидуально).

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

через указатель в котором хранится текст?

https://youtu.be/k5k-pjxolOI?t=4s

смареть вот енти видосы

тибе ни виндосы смареть нада а книжги читадь

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

Разумеется, виноват gcc. Сколько гениального кода было бы написано, если бы не он...

.. сцуко, в голос …

kolja ★★ ()

char str1 = «razraz»;

Лицорука, яйцонога...

erfea ★★★★★ ()

тебе ж сказали - иди книжку читай. видосы он смотрит, баран такой.

ckotinko ☆☆☆ ()
Ответ на: комментарий от I-Love-Microsoft

gcc кушает $ да, так и задумано и документации написано

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

я просто сча начал смареть вот енти видосы на сколька они нормальные?

Пролистал первые пять видео, и там про язык Си вообще ничего.

i-rinat ★★★★★ ()

при компиляции даже такого простейшего кода

Возьми какой-нибудь другой язык, не Си.

i-rinat ★★★★★ ()

Правило №1: винить компилятор ты можешь только после исключения проблемой с своими руками, другими библиотеками и стандартной библиотекой.

И да, вероятность того что виноват компилятор или его стандартная библиотека в процессе обучения - крайне мала. Настолько мала, что ей можно пренебречь.

Начни с проверки радиуса кривизны своих рук, методы проверки(и книги, которые надо почитать для выпрямления рук) уже подсказали

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Там в Cello все на дефайнах если шо, и на гитхабе автора много интересных проектов.

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

т.е. када я записываю

char * str1 = "razraz";

то автоматом память маллочится?
типа как будто выполнилось
str1 = (char *) malloc (7);
???

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

тут тогда еще один вопрос напрашивается — если сделал

char * str1 = "razraz";

то надо распускать бронирование памяти? т.е. free(str1); делать?

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

Настолько мала, что ей можно пренебречь.

Сначала во всём винишь компилятор. А потом вера в непогрешимость компилятора настолько укрепляется, что когда компилятор действительно ошибается, просто не можешь в это поверить.

Но таки да, ТС не наткнётся на баги компилятора ещё много-много лет.

i-rinat ★★★★★ ()
Ответ на: комментарий от safocl

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

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

i-rinat ★★★★★ ()
Ответ на: комментарий от saahriktu

Это надо было ещё постараться настолько ненадёжный код написать.

str1 = (char *) malloc (7); — что за семь? А если я поменяю строку и забуду поменять семь? А если я просто неправильно пальцем потыкаю и пропущу какой символ?

strcpy(str1, "razraz"); — небезопасная strcpy.

str1[6] = '\0'; — там и так уже 0, strcpy это гарантирует.

Сначала сделать именно указатель, затем выделить по этому указателю массив при помощи malloc(), а потом пользоваться как динамическим массивом.

Ради чего всё это?

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

gentoo_root ★★★★★ ()
Ответ на: комментарий от i-rinat

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

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

Тем более не надо такой код ставить в пример новичку.

я понял чо там написано и чо для чего, меня смутило на данный момент изучения лишь синтаксис с 'char * str1 = «razraz»;'. т.к. не понимаю, как без лишних закадровых движений присвоение указателю строки, он ее нормально кушает? в нем жеж должен быть адрес.

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

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

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

просто я изучал си++, там со строками было все просто.
и зачем енти все вопросы, если тут я просто хотел получить ответ на свой вопрос.

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

как без лишних закадровых движений присвоение указателю строки

Даже вот это.

В Си нет строк. Вообще. Все функции, работающие со «строками», на деле работают с указателями на память. В Си просто есть эдакая неявная договорённость называть куски памяти строками. «Строки-константы» на самом деле — строковые литералы. Это неименованная сущность, которая представляет собой указатель на массив байт где-то в памяти.

i-rinat ★★★★★ ()
Ответ на: комментарий от safocl

т.е. када я записываю

char * str1 = "razraz";

то автоматом память маллочится? типа как будто выполнилось

str1 = (char *) malloc (7);
???

Нет. В первом случае память под «razraz» грубо говоря резервируется при загрузке программы (бинарника) и является read-only. В случае malloc - память запрашивается в ходе выполнения программы и является перезаписуемой (и ее можно освободить в ходе выполнения программы с помощью free).

char * str1 = "razraz";

то надо распускать бронирование памяти? т.е. free(str1); делать?

Нет, за тебя это сделает ОС при выгрузке бинарника (при заверщении программы). Впрочем как и с неосвобожденной памятью выделенной через malloc (но это не значит, что можно забывать о free).

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

если тут я просто хотел получить ответ на свой вопрос.

Потому что твои вопросы неправильные. Это прямо по самим вопросам и видно.

просто я изучал си++

Просто нужно считать, что Си и Си++ — разные языки.

там со строками было все просто

Справедливости ради нужно отметить, что там тоже не просто. Строковые литералы там тоже не строки. Например, там нельзя сделать, как в питоне: "hello".find('e'). Или склеить два литерала через +.

Как-то не особо хорошо ты Си++ учил.

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

Ты ТСу хочешь плохо сделать, да? Он так никогда Си не поймёт.

i-rinat ★★★★★ ()

Не слушай этих неудачников. Посмотри ещё раз видос. Если голос школьника не нравится, найди другой, где голос у школьника не такой страшный.

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

gcc взбесился!

да я книгу по си на 800 страниц 10 лет назад прочитал!

и вообще это был си++

это называется патологическая ложь

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

Чтобы поменялись требования к размеру буфера должна быть своя логика, которой в коде из 10-ти строчек просто нет. И даже если писать большие проекты именно с таким подходом, то ничего страшного не будет, поскольку при появлении такой логики она будет соответствующим образом вкручена в код. Понятное дело, что лучше когда изначально известно, что такая логика в проекте будет, и сразу делать соответствующую реализацию, чтобы потом не надо было ничего менять. Но, если такой логики изначально нет, то и подпирать размеры буферов изначально нечем.

небезопасная strcpy

Безопасная, поскольку размер строки соответствует размеру буфера.

от малейшего чиха оно развалится

Нет.

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