Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. I want to copy strings,but occur this....."Access to memory errors....",why?

I want to copy strings,but occur this....."Access to memory errors....",why?

Scheduled Pinned Locked Moved C / C++ / MFC
c++data-structuresperformancequestion
12 Posts 6 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M milestanley

    /*Copy strings*/ #include "stdafx.h" #include <iostream> using namespace std; /*Achieve via array*/ void copy_array(char from[], char to[]) { int i = 0; while(from[i] != '\0') { to[i] = from[i]; i++; } to[i] = '\0'; } /*Achieve via pointer*/ void copy_pointer(char *from, char *to) { while((*to++ = *from++) != '\0'); } int _tmain(int argc, _TCHAR* argv[]) { char *from = "c plus plus"; char *to = "oooooooooooooooo"; //copy_array(from, to); copy_pointer(from, to);//Here: Test.exe Department of 0x00411536 unhandled exception: //0xC0000005: Write Access Violation occurs when the //position of 0x00417ac8,Why? cout << to << endl; return 0; }

    T Offline
    T Offline
    theCPkid
    wrote on last edited by
    #2

    Any idea what's the problem in the following code?

    int main()
    {
    char* str = "Hello";
    str[0] = 'Y';
    cout<

    L 1 Reply Last reply
    0
    • M milestanley

      /*Copy strings*/ #include "stdafx.h" #include <iostream> using namespace std; /*Achieve via array*/ void copy_array(char from[], char to[]) { int i = 0; while(from[i] != '\0') { to[i] = from[i]; i++; } to[i] = '\0'; } /*Achieve via pointer*/ void copy_pointer(char *from, char *to) { while((*to++ = *from++) != '\0'); } int _tmain(int argc, _TCHAR* argv[]) { char *from = "c plus plus"; char *to = "oooooooooooooooo"; //copy_array(from, to); copy_pointer(from, to);//Here: Test.exe Department of 0x00411536 unhandled exception: //0xC0000005: Write Access Violation occurs when the //position of 0x00417ac8,Why? cout << to << endl; return 0; }

      C Offline
      C Offline
      carter2000
      wrote on last edited by
      #3

      Loveprogramer wrote:

      char *from = "c plus plus"; char *to = "oooooooooooooooo";

      Here "from" and "to" are constant strings exactly, so the codes below would be mistake. "*to++ = *from++". If you declare "from" and "to" as array of string, your program would work fine. Just like: char from[] = "c plus cplus"; char to[] = "oooooooooooooooooooooo";

      L 1 Reply Last reply
      0
      • M milestanley

        /*Copy strings*/ #include "stdafx.h" #include <iostream> using namespace std; /*Achieve via array*/ void copy_array(char from[], char to[]) { int i = 0; while(from[i] != '\0') { to[i] = from[i]; i++; } to[i] = '\0'; } /*Achieve via pointer*/ void copy_pointer(char *from, char *to) { while((*to++ = *from++) != '\0'); } int _tmain(int argc, _TCHAR* argv[]) { char *from = "c plus plus"; char *to = "oooooooooooooooo"; //copy_array(from, to); copy_pointer(from, to);//Here: Test.exe Department of 0x00411536 unhandled exception: //0xC0000005: Write Access Violation occurs when the //position of 0x00417ac8,Why? cout << to << endl; return 0; }

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #4

        I think the problem is probably in the following statement: while((*to++ = *from++) != '\0');. The C++ language specification for the assignment operator states "The assignment operators return the value of the object specified by the left operand after the assignment." i.e the to pointer. Thus in the above statement the comparison is done with the next element of the to array, which being longer than the from array, contains the character 'o'. The while loop is now out of control as it is copying garbage. Rework your loop so that it tests the source array element for '\0', rather than the destination. [EDIT]Sorry, I got this wrong, the result of the expression is to before it gets incremented, hence it is correct.[/EDIT]

        modified on Monday, October 12, 2009 5:45 AM

        1 Reply Last reply
        0
        • T theCPkid

          Any idea what's the problem in the following code?

          int main()
          {
          char* str = "Hello";
          str[0] = 'Y';
          cout<

          L Offline
          L Offline
          Lost User
          wrote on last edited by
          #5

          theCPkid wrote:

          Any idea what's the problem in the following code?

          Apart from the fact that it will print "Yello", nothing.

          T 1 Reply Last reply
          0
          • C carter2000

            Loveprogramer wrote:

            char *from = "c plus plus"; char *to = "oooooooooooooooo";

            Here "from" and "to" are constant strings exactly, so the codes below would be mistake. "*to++ = *from++". If you declare "from" and "to" as array of string, your program would work fine. Just like: char from[] = "c plus cplus"; char to[] = "oooooooooooooooooooooo";

            L Offline
            L Offline
            Lost User
            wrote on last edited by
            #6

            carter2000 wrote:

            Here "from" and "to" are constant strings exactly, so the codes below would be mistake.

            Not true; declaring a string as char* str or char str[] yields the same result.

            C 1 Reply Last reply
            0
            • L Lost User

              theCPkid wrote:

              Any idea what's the problem in the following code?

              Apart from the fact that it will print "Yello", nothing.

              T Offline
              T Offline
              theCPkid
              wrote on last edited by
              #7

              have you really tried it? i have the feeling that you will get write access error...

              L 1 Reply Last reply
              0
              • L Lost User

                carter2000 wrote:

                Here "from" and "to" are constant strings exactly, so the codes below would be mistake.

                Not true; declaring a string as char* str or char str[] yields the same result.

                C Offline
                C Offline
                carter2000
                wrote on last edited by
                #8

                :) Maybe I made something wrong, but it just works fine in my computer. My compiler is VS2008.

                L 1 Reply Last reply
                0
                • M milestanley

                  /*Copy strings*/ #include "stdafx.h" #include <iostream> using namespace std; /*Achieve via array*/ void copy_array(char from[], char to[]) { int i = 0; while(from[i] != '\0') { to[i] = from[i]; i++; } to[i] = '\0'; } /*Achieve via pointer*/ void copy_pointer(char *from, char *to) { while((*to++ = *from++) != '\0'); } int _tmain(int argc, _TCHAR* argv[]) { char *from = "c plus plus"; char *to = "oooooooooooooooo"; //copy_array(from, to); copy_pointer(from, to);//Here: Test.exe Department of 0x00411536 unhandled exception: //0xC0000005: Write Access Violation occurs when the //position of 0x00417ac8,Why? cout << to << endl; return 0; }

                  I Offline
                  I Offline
                  Iain Clarke Warrior Programmer
                  wrote on last edited by
                  #9

                  Well, what have you discovered for yourself? Does that copy_pointer loop die on the first time it does something? When it hits a NULL? Does it die if to is a dynamically created variable? ie,

                  char *buf = new char [128]; // or (char*)malloc(128); if you prefer
                  copy_pointer (from, buf);
                  delete [] buf; // or free (buf); if you prefer.

                  I'm 90% sure I know what's wrong, but I'll wait for you to run these tests and see if you can find out for yourself. Iain.

                  I have now moved to Sweden for love (awwww). If you're in Scandinavia and want an MVP on the payroll (or happy with a remote worker), or need contract work done, give me a job! http://cv.imcsoft.co.uk/[^]

                  1 Reply Last reply
                  0
                  • T theCPkid

                    have you really tried it? i have the feeling that you will get write access error...

                    L Offline
                    L Offline
                    Lost User
                    wrote on last edited by
                    #10

                    theCPkid wrote:

                    i have the feeling that you will get write access error...

                    Yes, you're right; my apologies.

                    1 Reply Last reply
                    0
                    • C carter2000

                      :) Maybe I made something wrong, but it just works fine in my computer. My compiler is VS2008.

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #11

                      foot - mouth - brain! I must remember brain comes first. :sigh:

                      1 Reply Last reply
                      0
                      • M milestanley

                        /*Copy strings*/ #include "stdafx.h" #include <iostream> using namespace std; /*Achieve via array*/ void copy_array(char from[], char to[]) { int i = 0; while(from[i] != '\0') { to[i] = from[i]; i++; } to[i] = '\0'; } /*Achieve via pointer*/ void copy_pointer(char *from, char *to) { while((*to++ = *from++) != '\0'); } int _tmain(int argc, _TCHAR* argv[]) { char *from = "c plus plus"; char *to = "oooooooooooooooo"; //copy_array(from, to); copy_pointer(from, to);//Here: Test.exe Department of 0x00411536 unhandled exception: //0xC0000005: Write Access Violation occurs when the //position of 0x00417ac8,Why? cout << to << endl; return 0; }

                        R Offline
                        R Offline
                        rejupal
                        wrote on last edited by
                        #12

                        Try this char from[] = "c plus plus"; char to[] = "oooooooooooooooo"; instead of char *from = "c plus plus"; char *to = "oooooooooooooooo";

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups