LINUX.ORG.RU

кто виноват? (gcc stdio string)


0

0

пачему вот такая программа работает нормально
#include <string.h>
#include <stdio.h>

int main(){
	char * str1;
	char * str2;
	char * str3;
	str1 = "blabal";
	str2 = "2blabal2";
	fprintf(stdout,"%s",str1);
	strcat(str3,str2);
	fprintf(stdout,"%s",str1);
return 0;	
}
а вот такая:
#include <string.h>
#include <stdio.h>

int main(){
	char * str1;
	char * str2;
	char * str3;
	str1 = "blabal";
	str2 = "2blabal2";
	//fprintf(stdout,"%s",str1);
	strcat(str3,str2);
	fprintf(stdout,"%s",str1);
return 0;
}
валица в сегфал на вызов fprintf???
gcc 3.3.5
anonymous

>кто виноват?

вы

>валица в сегфал на вызов fprintf???

и первый вариант и второй вариант грешат абсолютным непониманием
того как работают библиотечные функции.

Первый аргумент strcat должен указывать на буфер содержащий достаточно места для первой строки+вторая + символ '\0'

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

char *strcat(char *dest, const char *src);
.....
Функция strcat() добавляет строку str к строке dest, перезаписывая символ `\0' в конце dest, и добавляя завершающий символ `\0'. Строки не могут перекрываться, а в dest должно быть достаточно места для размещения результата.
----
The strcat() function appends the src string to the dest string overwriting the `\0' character at the end of dest, and then adds a terminating `\0' character. The strings may not overlap, and the dest string must have enough space for the result.

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

2Amenich: от вас кроме как безосновательных криков "так нельзя" я не чего больш не услышал. обьеснитем так почему же нельзя?

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

ну да т.е. правильный вариант выглядит примерно так
#include <string.h>
#include <stdio.h>

int main()
{
	char *str1 = "blabal";
	char *str2 = "2blabal2";
	char str3[1024];

	fprintf(stdout,"%s\n",str1);
	str3[0] = '\0';
	strcat(str3,str2);
	fprintf(stdout,"%s\n",str3);
	return 0;      
}

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

в принцепе вы правы но по сушеству не кто не ответил на вопрос, почему 1 программа работает а 2рая вылится в сегфал хотя разнитца только в 1 строке.

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

< strcat(str3,str2);
> strncat(str3, str2, sizeof(str3));

И по-хорошему возвращённое значение ещё бы проверить (как минимум для
того, чтоб быть уверенным, что там хватило место для нуля).

Это сейчас у тебя оно влезает в 1024 байта, а что окажется в str2 через
полгодика - ведомо лишь Аллаху.

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

То, что первая у тебя как-то работает - это недоразумение, причём недоразумение абсолютно непереносимое (то есть она может перестать работать, будучи скомпилированной под другую платформу, другим компилятором или другой версией того же самого компилятора; или же в зависимости от расположения планет). Никто не гарантирует, что криво написанная программа сразу свалится в сегфолт - это было бы слишком хорошо. :) Кривых программ просто не осталось бы. :)

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

у меня тупой вопрос про массивы.
допустим есть массив char * array1[10][2][300]
я записываю чегонибудь в array1[0][0][0] потом записываю в элемент array1[0][1] строку (не знаю как это коректно сказать, кароче fgets(handle[0][1],100,fd);) потом записываю в array1[1][0][0] целое 9 знаков после чего данные в array1[0][0][0] изменяются. кроме упрашение данной структуры с массивом еше что можно сделать?
ЗЫ: писал много на пхп поэтому нету опыта работы с памятью не знаю какие при этом могут получится глюки итд.

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

У меня первая выдаёт

     10203:	
     10203:	calling fini: /lib/tls/libc.so.6 [0]
     10203:	
blabalblabal

Нормальной работой это назвать нельзя. 
Ещё можно valgrind-ом проверять, он хорошо ругается на такие вещи.

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

А кстати почему это происходит, интересно?

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

int main(){
    char * str1;
    char * str2;
    str1 = "blabal";
    strcat(str2,str1);
    return 0;       
}

Такое в stderr выдаёт ерунду, которую я написал выше. Программа неправильная, это понятно. Но почему она что-то печатает? Какой-то механизм защиты памяти что ли?

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

я так препологаю в посте Teak это описано. у меня лично оное вылица в сегфал.

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

> вы что-нибудь читали по языку прежде чем пЕсать садиться ? очевидно что нет

Этот код допустим:

char *s1, *s2;
s1 = "foo";
s2 = "bar"

В стеке выделяется память под два указателя (s1 и s2), и две строковые константы, "foo" и "bar",
при этом одновременно указателям s1 и s2 присваиваются адреса этих констант. Ну и где ошибка?

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

А, ну да, сорри, ты про бред Amenich'а очевидно...

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

Нифига не понял в твоём вопросе. Давай ты как-то с примерами кода, что ли... И чего собственно добиться хочешь.

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

> В стеке выделяется память под два указателя (s1 и s2), и две строковые константы, "foo" и "bar"

Кстати в порядке придирки, память под строки в стэке не выделяется, они в сегменте данных находятся ещё с запуска программы. :) Да и чтобы выделялась память под указатели на стэке, тоже весьма сомнительно, эти указатели нафиг не нужны и наверняка будут соптимизированы компилятором, а функции fprintf просто будет послана константа - указатель на эти строки. :)

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