LINUX.ORG.RU

строки в C


0

0

Здравствуйте

допустим есть функция:

int some_operation (static char *xxx) { int len = 0; char *p; p = xxx; while ((*p) != 0) { p++; len++; } printf ("\n%s\n", xxx); return (len); }

и вызовы этой функции:

some_operation ("XXX1"); some_operation ("XXX2"); some_operation ("XXX3"); some_operation ("XXX4");

первые пару вызовов отрабатывают нормально, дальше проблемы: XXX1 XXX2 XXX34f XXX45ujd

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

как с этим бороться, ведь при вызове printf ("XXX1"); таких проблем не возникает.

вопрос наверное простой и глупый, но я надеюсь на помощь.

> строки, передаваемые в функцию в таком виде не имеют завершающего 0 в конце

имеют

> вопрос наверное простой и глупый

ага

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

phoenix ★★★★
()

кстати, а как вот это
int some_operation (static char *xxx)
                    ^^^^^^
вообще компилируется? у меня gcc говорит
error: storage class specified for parameter `xxx'

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

> а как вот это ... вообще компилируется?

Наверное, автор имел в виду не static, а const ;)

Автору топика:

Ошибка была при вызове.

Die-Hard ★★★★★
()

2jackLucas:

Все же не выдержал, глядя на столь избыточный код.
Так обычно на Фортране пишут:).

Вот полностью эквивалентная конструкция:

int some_operation (const char *xxx)
{
char *p=xxx;
   while (*p++ != 0);
   printf ("\n%s\n",xxx);
   return p-xxx-1;
}

Die-Hard ★★★★★
()
Ответ на: комментарий от jackLucas

> 2. в чём ошибка при вызове? 

Я ж не телепат...

Давай код. Как ты написАл, все работает:

$cat junk.c

#include <stdio.h>

int some_operation (const char *xxx)
{
int len = 0;
char *p;

   p = xxx;
   while ((*p) != 0) {
      p++; len++;
   }
   printf ("\n%s\n",xxx);
   return (len);
}

int main(void)
{
some_operation("XXX1");
some_operation("XXX2");
some_operation("XXX3");
some_operation("XXX4");
return 0;
}

$gcc -o junk junk.c
junk.c: In function `some_operation':
junk.c:8: warning: assignment discards qualifiers from pointer target type

$./junk

XXX1

XXX2

XXX3

XXX4

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

код привести не могу, он довольно жирный :(

но я заметил одну забавную деталь:

в коде перед вызовом some_operation ("bla-bla-bla") с помощью libxml2 идёт разбор некоторой xml'ки. так вот, когда у передоваемой в some_operation строки появляется неожиданный "хвост", этот хвост выглядит как куски тегов этой самой xml'ки. так что видимо надо туда копать.

но может подскажешь, как такое может получиться? как защитить строки, передаваемые в "" (some_operation ("XXX"), т.е. память под этоту строку выделена не динамически) от таких наложений памяти?

P.S. компилирую и с -O3 и с -O0 - результат один и тот же.

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

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

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

> ... как защитить строки, передаваемые в "" (some_operation ("XXX"), т.е. память под этоту строку выделена не динамически) от таких наложений памяти?

Никак :( Очевидно, стек портится.

Если не понимаешь, что происходит, можно посоветовать только перейти на Жабу или ЦеШарп. Там этого не будет.

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

Вдогонку:

> ...как защитить строки,...

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

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

> В принципе, такое можно сделать (с отладочной целью) -- типа, если пойдет что не так, то вырубить программу и выругаться -- но я не думаю, что тебе это надо. Это вроде как из пушки по воробьям будет...

я думаю insure поможет

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

> insure

поподробней, если можно

кстати, почему любые манипуляции (с libxml например) не влияют на printf, который работает железно правильно?

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