c++오류좀 잡아 주세요 ㅜㅜ

yyjjang9의 이미지

char* newQ = new char[capacity];
 
 
 
 for (int j =0; front <= (capacity / 2)-1;j++)
   {
 
   newQ[j] = q[front];
 
 
 
   if (;front == (capacity / 2) - 1;)
    {
     front = 0;
     for (int i = 0; i < rear;)
      newQ[j++] = q[i++];
    }
   }
 
  delete q;
   q = newQ;

다른 문장에서는 이상이 없는데 프로그램이 유독 이 문장에만 접근하면 디버그 오류가 뜨네요.

변수 선언에는 전혀 이상이 없고요. 동적할당 부분에서도 이상이 없습니다. 문장에서 어디가 잘못

되어서 그럴까요?

이 문장만 따로 떼어서 돌려보면 오류가 생깁니다. 왜 그럴까요 ㅜㅜ 알려주세요.

#include<iostream>
using namespace std;
 
int main(void)
{
 char a[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
 int capacity = 8;
 char* q = a;
 for (int i = 0; i < 8; q++)
  cout << q[i];
 char* newQ = new char[capacity];
 int front = 6;
 int rear = 2;
 for (int j = 0; j<=2; j++)
 {
 
  newQ[j] = q[front++];
 
 
 
  if (j == 2)
  {
 
   for (int i = 0; i < rear;i++)
    newQ[j++] = q[i];
  }
 }
 
 delete q;
 q = newQ;
 for (int i = 0; i < 8; i++)
  cout << q[i];
 return 0;
}

이 코드는 제가 따로 떼어서 돌려본 코드 입니다. 무엇이 잘못 되었나요?? 제발 알려주세요 ㅜㅜ,,.

yukariko의 이미지

int front = 6;
for (int j = 0; j<=2; j++)
newQ[j] = q[front++];

문제가 보이지 않나요?

반복이 3번이루어지기 때문에 newQ에는 a배열의 범위를 넘어간 값이 저장되게 됩니다.

뭐 이것으로는 런타임에러가 발생하진 않을탠데,

문제는 delete q가 되겠네요.
a배열이 동적할당된것이 아닌 정적 배열이기 때문에
delete 구문은 작동하지 않습니다.
a배열을 new를 통해 선언하시거나 delete 구문을 지워줘야겠네요.

shint의 이미지


디버깅 하는 방법만 적어봤습니다.
내용은 이해하기 어렵네요. ㅇ_ㅇ;;

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
 
 
int main(int argc, char *argv[])
{
    char a[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int capacity = 8;
    char* q = a;
 
    //모두 같습니다.
    printf("%x\n", a);
    printf("%x\n", &a[0]);
    printf("%x\n", &a);
    printf("%x\n", q);
 
 
    for (int i = 0; i < 8; i++)  //q++ 오류. 
    {
        printf("%d ", i);
        printf("%x ", q);
        printf("%x ", q[i]);
        printf("%x ", &q[i]);
        printf("%c\n", *(&q[i]) );
//        cout << q[i];
    }
 
 
printf("---------------\n");
 
    char* newQ = new char[capacity];
    int front = 6-1; //범위를 넘어서. 1을 뺌. 
    int rear = 2;
    for (int j = 0; j<=2; j++)
    {
//newQ 0     q[6]
//newQ 1     q[7]
//newQ 2     q[8] -- 배열에 갯수는 0 1 2 3 4 5 6 7 까지. 8개. 범위를 넘어서 오류. 
 
 
        newQ[j] = q[front]; //newQ[j] == &newQ[j] == q[j] == &q[j] 주소.입니다. 값을 사용할때는. *(&q[j])로 사용합니다. 
        front++;  //++는 배열밖에 놓는것이 확인하기 좋습니다. 
 
        printf("%x ", newQ[j]);
        printf("%d ", *&newQ[j]);
 
        if (j == 2)
        {
                for (int i = 0; i < rear; i++)
                {
//newQ[2]       q[0]
//newQ[3]       q[1]
                    newQ[j] = q[i];
                    j++;
                }
        }
    }
 
//q는 a라는 상수배열이므로 해지하지 않아도 되는것으로 알고 있습니다. 
//그렇지만. newQ를 사용한다면. 가능합니다. 
    q = newQ;
 
printf("\n");
printf("---------------\n");
    for (int i = 0; i < 8; i++)
    {
//        cout << q[i];
        printf("%d ", i);
        printf("%x ", q);
        printf("%x ", q[i]);
        printf("%x ", &q[i]);
        printf("%c\n", *(&q[i]) );
    }
 
 
    delete q;
    q = NULL;
 
 
 
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
 
 
/*
22ff70
22ff70
22ff70
22ff70
0 22ff70 1 22ff70 
1 22ff70 2 22ff71 
2 22ff70 3 22ff72 
3 22ff70 4 22ff73 
4 22ff70 5 22ff74 
5 22ff70 6 22ff75 
6 22ff70 7 22ff76
7 22ff70 8 22ff77
---------------
6 6 7 7 8 8
---------------
0 3e37f0 6 3e37f0 
1 3e37f0 7 3e37f1
2 3e37f0 1 3e37f2 
3 3e37f0 2 3e37f3 
4 3e37f0 0 3e37f4 
 
*/

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.