2017-01-23 4 views
-2

나는 정확히 가 어떻게 작동하는지 잘 모르겠다. 내가 문자열로 임명 값이 하나 개의 문자보다 큰 아직이 잘 컴파일 보이기 때문에 C 문자열 mallocing

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

char * string = (char*) malloc(sizeof(char)); 
string = "abc"; 

int * test = (int*) malloc(1 * sizeof(int)); 
*(test) = 5; 
*(test + 1) = 6; 


} 

나는 출력 오류이 예상. '문자열'지금

  1. 을 저장됩니다 :

    나는 몇 가지 질문이? 내가 할당 한 한 공간 후에 힙의 메모리 공간에 있습니까?

  2. 왜 char을 사용하면 포인터를 통해서만 int를 직접 지정할 수 있습니까?

은 정말 내가 여기에 '문자열'지금 저장됩니다

+1

[malloc의 반환 값을 캐스팅하는 이유는 무엇입니까?] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)? – PaulMcKenzie

+0

@PaulMcKenzie 나는 MIT 과정을 따르고 있는데 ppt 예제가 이것을 사용했지만 추가 정보로 바보가 된 것 같다. – DarkInc

+0

'* (test + 1) = 6;'경계 밖에서 쓰다 –

답변

1

:

아마 당신이 원하는 : 대신의

char *string = (char*) malloc(sizeof(char) * 100); // allocate space for 100 chars 
strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string 

:

char *string = (char*) malloc(sizeof(char)); // << this allocates only a single char 
string = "abc"; 

그리고

*(test) = 5; 
*(test + 1) = 6; 

이 더 잘 기록 :

test[0] = 5; 
test[1] = 6; 

정확히 일치하는 가독성 문제입니다. 당신이 아니라 여기에 단지 1 문자에 대한 메모리를 할당 할 경우

:

는 너무 적은 메모리를 할당

char *string = (char*) malloc(sizeof(char)); // allocate space 1 char strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string 

다음 프로그램이 여전히 잘 컴파일되지만 런타임에 문자열이 부분적으로 복사됩니다 할당되지 않은 메모리로 이동하여 정의되지 않은 동작 (Google "정의되지 않은 동작")이 발생합니다.

+0

하지만 한 숯에 대한 공간 만 할당하는 것은 가능하지 않습니다. "bc \ 0"을 포함하는 주소를 덮어 쓰는 다른 변수를위한 공간을 할당합니까? 편집 : 네, 내 의견이 끝나기 전에 대답했다 – DarkInc

+0

@DarkInc 편집 된 대답을 참조하십시오 –

+0

마술 번호는 매우 나쁜 연습입니다. 나쁜 습관으로 새로운 프로그래머를 시작하는 것은 나쁜 생각입니다. –

1

뭘하는지 모르겠어요? (힙) 초기 동적 할당을 추적 손실 된 당신은 메모리 누수가 -

char * string = (char*) malloc(sizeof(char)); 
string = "abc"; 

string

이제 "ABC"(리터럴 문자열)를 가리 킵니다.

3

이 코드

string = "abc"; 

char *string 변수에 "abc" 상수 문자열 주소를 할당한다. malloc() 전화에서 회신 된 메모리 주소 - string에 있던 -이 덮어 쓰기되고 손실됩니다. 다른 답변에 추가

0

실례를 들어 보겠습니다.

A 씨가 주소 "abc"에 있다고 가정 해 보겠습니다. 자, 일부 B 씨가 "xyz"라는 주소에서 살기 시작합니다. 곧, Mr. B 주소 "xyz"는 "abc"로 이름이 바뀝니다. 이제 주소 "abc"로 가면 A 씨가 아닌 B 씨를 만날 것입니다. 그렇다고해서 A 씨 장소가 철거 된 것은 아닙니다. 그것은 단순히 A 씨의 거실에 도달 가능한 주소가없고 잃어 버렸음을 의미합니다.

마찬가지로, 메모리는 malloc 에드 메모리 '다음 string에 에드와 string는 이전 malloc에 주소를 가지고는 string는 "ABC"는 뜻을 할당 다시'. 나중에 "abc"가 일부 메모리에 쓰여지고 해당 메모리의 주소는 string에 저장됩니다. 따라서 메모리 누수라는 영원히 기억을 잃어 버리게됩니다.

0

컴파일러는 허용되는 작업을 수행하지 못하도록합니다. 그러나 string이 할당되고 재 할당되기 전에 사용되지 않았기 때문에 1에 대한 경고가 표시 될 수 있습니다 (컴파일러가 관련 경고를 출력하십시오).

2로

), 당신은 당신이 malloc에 의해 반환 된 포인터를 수행 할 사용 너무 작게 일어나는 인수, malloc 될 일이 함수를 호출하지만, 구문, 올바른 때문에 컴파일러는 불평하지 않습니다.

대답 string"abc" 포인트와 malloc에서 이전 값은 당신이뿐만 아니라 test[0] = 5;을 할 수있는)

2

를 분실)

1

합니다.

2)의 동작은 정의되지 않은 동작입니다 (범위를 벗어난 배열에 액세스).

0

처음에는 요청 된 크기의 한 문자로 동적 메모리가 할당되었습니다.

char * string = (char*) malloc(sizeof(char)); 

그리고 포인터가 문자열 리터럴 "abc"의 첫 번째 문자 주소로 재 할당되었습니다.

string = "abc"; 

결과적으로 동적으로 할당 된 메모리의 주소가 손실되고 프로그램에 메모리 누수가 있습니다.

프로그램이 다음이 문 C++로 작성된 것입니다 경우 상수 문자 배열과 포인터의 유형이 C++에서 문자열 리터럴은 string

const char *string; 
같이 선언 shuld 때문에

string = "abc"; 

는 컴파일러 진단 메시지가 발생할 수

문자열 리터럴의 경우 정적 저장 기간을 가지며 main이 컨트롤을 가져 오기 전에 할당됩니다. 일반적으로 모든 문자열 리터럴은 소위 문자열 리터럴 풀의 장소입니다.대신이 문

string = "abc"; 

당신은 프로그램이 동작을 보증되지이 경우

strcpy(string, "abc"); 

을 작성할 수 있습니다. 그러나 일반적으로 함수 malloc이 16 바이트와 동일한 단락의 값과 동일한 최소 메모리 확장 영역을 할당한다는 특징으로 인해 작업을 계속 성공적으로 수행 할 수 있습니다.

+0

이것은 C 질문입니다. C++ 코드의 동작은 부적절합니다. –

+0

@ M.M "관련성이없는"정보는 없습니다. C에서 1) 포인터는 또한 C에있는 qualifier const로 선언 할 수 있으며 C++에서와 같은 접근법을 사용할 수 있습니다. 2) C와 C++에서 같은 구조를 비교하면 C와 C++을 더 잘 이해할 수 있습니다. –