2013-12-11 5 views
0

всякий раз, когда значение присваивается любой переменной указателя, которая не работает в среде Windows 7 (32 бит). Программа, содержащая такой код, получает ошибку выполнения. На самом деле я пытался объединить две строки без использования каких-либо функций библиотеки. Пример:Указатели C++ под окнами 7

int main() 
    { 
     char *s1 = "Hello"; 
     char *s2 = "World"; 
     char *p; 
     p = s1; 

     while(*s1 != '\0') 
      s1++; 

     while(*s2 != '\0') 
     { 
      *s1 = *s2; // this line creating problem 
      s1++; 
      s2++; 
     } 
     *s1 = '\0'; // this line also creating problem 

     while(*p != '\0') 
     { 
      cout<<*p; 
      p++; 
     } 


     return 0; 

    } 
+9

** Никогда ** используйте не-const 'char *' для указания на строковый литерал. – chris

+0

Действительно ли это C++? 'char * s1 =" Hello ";' даже не компилируется. (Не следует «while (...)
' ...>. <) –

+2

@ H2CO3, все еще может быть pre-C++ 11. Это только устарело. В любом случае, AFAIK, компиляторы по-прежнему принимают его на C++ 11 по любой причине. – chris

ответ

4

Вы не выделили места для записи в - вот почему у вас возникли проблемы.

Вы создали s1 и указали его на некоторую постоянную память, и когда вы пытаетесь добавить, вы записываете в этот регион.

Вы можете установить p, чтобы указать на некоторую память: a) вы владеете (имеете право писать, а не только физические возможности) и b) достаточно велики для полного выделения.

Ваш самый простой способ сделать это будет вместо этого использовать std::string - ведь вы говорите, что используете C++.

0
char *s1 = "Hello"; 
char *s2 = "World"; 

При создании s1 и s2, как это, вы не можете писать:

*s2 = anything; 

Из строки s1 и регулированием количества s2 неизменны по умолчанию.

0

Здесь "Hello" строковый литерал, который по определению const. s1 - это указатель на первый элемент этого строкового литерала и поэтому указывает на постоянную память. Вы не можете изменить память только для чтения, и поэтому вы не можете изменить то, на что указывает s1. Было бы гораздо более accrate и лучше, если бы вы объявили это как:

const char *s1 = "Hello"; 

В C++ 03, есть специальное правило, которое позволяет назначать указатель на строку буквального к не- const указателя. Однако это правило было удалено на C++ 11, и теперь ваш код является незаконным.

Это хорошо, потому что даже в C++ 03 вы ничего не можете (с юридической точки зрения) делать с s1, что вы не могли сделать, если это было const.

Позже вы делаете что-то явно неправильно:

while(*s2 != '\0') 
     { 
      *s1 = *s2; // this line creating problem 
      s1++; 
      s2++; 
     } 

Я не удивлен, что строка кода вызывает проблемы для вас - это вызывает неопределенное поведение, потому что вы изменяете память только для чтения.

Похоже, что вы действительно пытаетесь создать строку, которая инициализируется некоторым известным (неизменным) значением, а затем модифицирует строку. Чтобы сделать это, вы должны сделать копию строкового литерала. Самый простой способ сделать это состоит в использовании std::string:

std::string s1 = "Hello"; 

Здесь "Hello" еще строковый, но s1 строится отходящим от него. s1 полностью отделен от строкового литерала, и теперь вы можете изменить его, как хотите.

Смежные вопросы