странное поведение в функции C, строка не переносится - PullRequest
1 голос
/ 15 декабря 2011

У меня есть функция как таковая:

int foo(void *val){
(char *)val="Long String";
return 0;
}

Эта функция называется как:

char str[25];
foo(str);
printf("%s",str);

Я почему-то ничего не распечатал. что здесь не так?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Вы на самом деле не копируете данные так, как вы думаете. Все, что вы делаете, это изменяете значение параметра так, чтобы оно указывало на другой адрес памяти. Параметр передается по значению, поэтому любое изменение в нем не отражается в вызывающем коде. Для того, что вы пытаетесь, вам нужно использовать strcpy() или strncpy(), например:

int foo(char *val)
{ 
    strcpy(val, "Long String");
    return 0; 
} 

Или:

int foo(char *val, int maxlen)
{ 
    strncpy(val, "Long String", maxlen);
    return 0; 
} 
2 голосов
/ 15 декабря 2011

Вы сохраняете указатель на "Long String" в переменную val, которая выделяется в стеке . Время жизни переменной увеличивается только во время вызова до foo().

Вы не хотите хранить адрес в стеке "Long String". Вы хотите скопировать строку под указанным адресом.

Вы должны сделать это вместо:

int foo(void *val){
  strcpy((char*)val, "Long String");
  return 0;
}

Хотя это небезопасно. Вы должны передать максимальный размер буфера в foo и использовать strncpy() вместо strcpy().

0 голосов
/ 15 декабря 2011

Вы ничего не копируете в str.Вы просто редактируете значение указателя, которое вы передали в ...

Вызов foo(str) создает новую временную переменную с именем void* val и указывает на char[0].Затем вы изменяете val так, чтобы он указывал на начало строки "Длинная строка".

Если вы действительно хотите заполнить буфер char str[25], используйте strncpy:

 int foo (char* buf)
   { return strncpy (buf, "Long String", 25); }

Однако, если вы когда-либо отправите эту подпрограмму char[] с менее чем 25 позициями, у вас будут серьезные проблемы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...