2012-08-01 4 views
0

코드에 _CrtIsValidHeapPointer 오류가 있습니다. 그리고 마침내 문제의 원인을 찾아 냈습니다.
I 아래를 설명하기 위해 예를 사용heap의 char []에 값을 어떻게 할당합니까?

char* c=(char*)malloc(20*sizeof(char)); 
//cout<<&c<<endl; 
c="hello world"; 
//cout<<&c<<endl; //if you uncomment the 2 clauses,you'll see the address is the same 
            //which means the string literal is in the heap 
cout<<c<<endl; 
free(c); 

1) 문자열 상수가 사용 공간이 해제 될 수없는 것 같았다? 왜?

2) valee를 char 배열에 할당하는 방법은 무엇입니까?
ps : 나는 잘 작동하는 sprintf(c,"hello world");을 사용합니다. 그러나 더 좋은 방법?


답변을 읽은 후에. 나는 &의 의미를 오해한다는 것을 깨닫는다. c.
대신 printf("%p\n",c);을 사용해야합니다.

+1

[C에서 새 문자열 값을 올바르게 할당하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/3131319/how-to-correctly-assign-a-new-string-value-in-c) –

+0

@ JensGustedt : 그들은 몇 가지 연관성과 유사점을 가지고 있습니다. 그러나 나는 그것이 중복이라고 생각하지 않는다. 어쨌든 링크 해 주셔서 감사합니다. 유용합니다. – duleshi

답변

6

strcpy 또는 더 안전한 버전 strncpy을 사용해야합니다. strncpy을 사용하면 충분한 공간이 없으면 문자열을 NUL 종료해야합니다.

예 :이 경우, 우리는 충분한 공간이 c에가 알고, 그래서 우리는 strcpy를 사용할 수있는

char *some_other_string = ...; 
int len = strlen(some_other_string); 
char *c = malloc((len + 1) * sizeof(*c)); 
if (c == NULL) 
    // handle error 

strcpy(c, some_other_string); 

free(c); 

참고. 우리가 알 수없는 경우, 당신은 당신이 그것을 처리 할 수있는 곳까지 문자열을자를 수 :

char *some_other_string = ...; 
char *c = malloc((MAX_LEN + 1) * sizeof(*c)); 
if (c == NULL) 
    // handle error 

strncpy(c, some_other_string, MAX_LEN); 
c[MAX_LEN] = '\0'; 

free(c); 

참고 공간이 충분하지 않으면 strncpy의 경우, 문자열이 아닌 NUL이 종료이라고하고 당신은 그것을 수동으로해야만합니다.


사이드 참고 :

&c 변수 c의 주소입니다. 내용과 관련이 없으므로 c으로 무엇을 하든지간에 &c은 변경되지 않습니다.

+0

당신은'c [MAX_LEN]'대신'c [MAX_LEN - 1]'을 사용했습니다. – ouah

+0

@ouah, 아니,'c '에'MAX_LEN + 1' 메모리를 할당하려고했지만, 그것을 지적 해 주셔서 감사합니다! – Shahbaz

+0

@Shahbaz : 변수 공간의 끝에 endline을 넣고 싶기 때문에 이것이 정확할 것이라고 생각합니다. '[MAX_LEN + 1] ='\ 0 '; –

7

strcpy을 사용하여 문자열을 복사해야합니다.

할당 c="hello world"은 문자열의 내용을 복사하지 않지만 문자열 리터럴의 주소를 포인터 c에 할당합니다. 나중에 free(c)을 호출하면 포인터가 유효한 힙 주소가 아닙니다.

// 당신이이 절을 주석을 해제하는 경우, 당신은 주소가 무엇을보고 같은

포인터 c가 없습니다 볼 만의 주소 것 포인터는 분명히 동일합니다.

3
c = "hello world"; 

당신은 리터럴 "hello world" 문자열 포인터에 c 포인터를 modidying 있습니다. 이것은 문자열을 복사하지 않고 c 포인터 만 수정하면됩니다. 배열 char의 문자열을 복사하려면 strcpy 함수를 사용해야합니다.당신은 언어의 C++ 부분을 사용하는 경우

strcpy(c, "hello world"); 
0

, 이것은 모든 C++ 표준 라이브러리의 std::string에 의해 처리됩니다.

std::string c = "hello world"; 
cout << c << endl; 

완료!

수동으로 관리 할 필요가 없습니다.

관련 문제