Почему мой источник меняется при использовании strcpy в c - PullRequest
2 голосов
/ 17 марта 2011

После использования strcpy источник искажается и получает правильный пункт назначения. Вот мой код, пожалуйста, предложите мне, почему мой источник искажен? Если я сохраняю фиксированный размер во втором символьном массиве q [], то мой источник не изменяется. Почему это странное поведение. -
Я использую MSVC 2005

void function(char* str1,char* str2);
void main()
{

    char p[]="Hello world";
    char q[]="";
    function(p,q);
    cout<<"after function calling..."<<endl;
    cout<<"string1:"<<"\t"<<p<<endl;
    cout<<"string2:"<<"\t"<<q<<endl;
    cin.get();
}

void function(char* str1, char* str2)
{
    strcpy(str2,str1);
}

ВЫХОД:

after function calling...
string1:        ld
string2:        Hello world

Заранее спасибо,
Malathi

Ответы [ 7 ]

8 голосов
/ 17 марта 2011

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

6 голосов
/ 17 марта 2011

q имеет только пробел для 1 символа, который заканчивается \0. Пожалуйста, прочитайте книгу о Си - вам нужно кое-что узнать об управлении памятью.

Скорее всего, ваша память выглядит так (упрощенно): Qpppppppppppp. Поэтому, когда вы набираете значение q, вы перезаписываете части памяти p.

Поскольку вы используете C ++: просто используйте std::string и или std::stringstream вместо необработанных массивов символов.

4 голосов
/ 17 марта 2011

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

Объявите q достаточно большим, чтобы вместить вашу строку. Кроме того, вы можете использовать strncpy, чтобы быть в безопасности.

3 голосов
/ 17 марта 2011

char q[] = ""; создает массив символов с ровно одним элементом - копирование большего количества данных в него не зарезервирует для него больше памяти.

Итак, что происходит, когда вы записываете пространство, отведенное для qвы начинаете переписывать то, что находится в p - две переменные находятся рядом друг с другом в памяти.

2 голосов
/ 17 марта 2011

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

2 голосов
/ 17 марта 2011

strcpy ожидает, что вы предоставите выделенный буфер хранения, а не просто указатель на символ *.Если вы измените char q[]=""; на char q[50];, это будет работать.Так как вы указываете strcpy только указатель на строку нулевой длины, у него недостаточно места для хранения скопированной строки, и она перезаписывается, что также приводит к повреждению памяти.

2 голосов
/ 17 марта 2011

Массив "q" имеет длину всего один байт; в нем определенно нет места для строки "Hello, World"! Когда вы пытаетесь скопировать «Hello, World» в q, вы в конечном итоге превышаете границы q и перезаписываете p, который находится рядом с ним в стеке. Я представляю, как нарисовать диаграмму того, как все это расположено в стеке, и вы можете точно определить, почему мусор, который заканчивается в p, просто "ld".

...