LINUX.ORG.RU

Да, опечатался, s/i = 0/i = j = 0/ конечно же. Сегфолтится. :(

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

хех какой я невниматльный... а gdb что говорит... после сегфолта по команде where

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

было уже кстати а где находятся строки константы.... не в секции RO_DATA может поэтому?

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

Да, действительно сегфолт, даже если проинициализировать j. Это потому, что параметр так передается. Так работает:



#include <stdio.h>

void squeeze (char s[], char c)
{
int i, j = 0;

for (i = 0; s[i] != '\0'; i++)
if (s[i] != c)
s[j++] = s[i];

s[j] = '\0';
}

int main (void)
{
char a[]="foo bar baz";
squeeze(a, 'b');
return 0;
}

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

ага objdump показал что размер секции .rodata всегда равен размеру строки... это секция находиться видимо в сегменте доступном только для чтения..

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

Ого, я таких тонкостей ещё не знаю; а что бы почитать об этом? Интересно. Мой мозг почти разорвался, пока я пытался найти причину ошибки.

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

Читать там, где говорится об implementation-defined поведении.

tailgunner ★★★★★
()

"foo bar baz" - так этож константа вроде

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

ISO/ IEC JTC1/SC22/WG14 N843

Glava 6.4.5 String literals:

[#6] It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

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