سؤال

وهذه هي مشكلتي الثانية اليوم، مؤشرات تعطي لي الكوابيس. أنا أحاول لجعل برنامج التي تفعل الشيء نفسه الذي وظيفة strcpy () القيام به .. مرة واحدة وأنا أحاول it..it حوادث وأنا متأكد 100٪ أن هذه قضية المؤشرات في قانون بلدي. أعتقد لأن هناك نوعا من مؤشر unintiallized (* نسخ) .. لكن لقد تعيين NULL إلى ذلك ... لذلك يمكن لأي أحد أن يقول لي ما هو باطل الاحالة هو بالضبط عنه؟ لأنني أعتقد أنني تسيئوا استخدامها. وتقول لي من فضلك ما تصحيحات يمكن إدخالها على برنامج لتشغيل بشكل طبيعي.

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char *copied = 0 ;

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){

    for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

}

وشكرا مقدما.

هل كانت مفيدة؟

المحلول

حسنا، mycpy الخاص بك هو الحق تقريبا (على الرغم من أنك قد قمت الأقواس المستخدمة بدلا من الحساب، أي a[i] بدلا من *(a+1)). من أجل طباعة سلسلة نسخها بشكل صحيح، يجب أن يكون الحرف الأخير الصفر، ولكن آخر واحد هو لا نسخها من قبل وظيفة الخاص بك. لذلك ينبغي أن يكون بدلا من مثل

void mycpy(char *b , char *a)
{
    int i;
    for(i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
    *(b+i) = 0; // or "\0", doesn't matter    
}

وعلاوة على ذلك المتغير

char *copied = 0 ;

لا يشير إلى الذاكرة صالحة، لذلك كنت تقرأ من موقف الذاكرة 0 الذي يعتبر غير قانوني. هل يمكن تحديد المتغير كما مجموعة

char copied[20];

نصائح أخرى

لديك لتخصيص بعض الذاكرة لنتيجة عملية النسخ.

لم initialised

في حالة copied الخاصة بك، لذلك كنت تحاول الكتابة إلى مؤشر فارغة. وفيما يلي تخصيص ذاكرة كافية بالنسبة لك لنسخ original إلى copied

char* copied = new char[strlen(original)+1];

لديك مؤشرات، لكنهم لا يتم الإشارة إلى أي ذاكرة. تحتاج إلى تخصيص بعض الذاكرة لهذا العمل.

char *original;

وهذا هو مجرد مؤشر إلى بعض الذاكرة التي هي من نوع شار. لا يمكنك تعيين ذلك إلى "هذا هو النص" لأنه هو مجرد مؤشر. أنه ليس لديه أي مساحة للتخزين "هذا هو النص".

char original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";

وستعمل، أو

char *original;
char * copied;

original = malloc( 15 );
copied = malloc( 15 );

mycpy( original, "this is a text" );
mycpy( copied, original );

وكلا الطريقتين انتزاع 15 بايت بالنسبة لك لتخزين النص. يستخدم المثال الأول 15 بايت من المكدس. يستخدم المثال الثاني 15 بايت من الكومة.

وثابت:

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char copied[30]; // you need to actualy allocate space 
    // (this is on stack, you could use new as well, for heap allocation)

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){
    int i =0;
    while (*(a+i)) {
        *(b+i) = *(a+i);
        ++i;
    }
    *(b+i) = '\0'; // null termination
}

في هذا السطر:

for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

وانها dereferencing من b+i أن يتسبب في حدوث الخطأ. كنت dereferencing 0 (NULL)، وهو رقم الخطأ 1 المؤشر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top